@assistant-ui/react 0.15.31 → 0.15.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_virtual/_rolldown/runtime.js +1 -2
- package/dist/adapters/OpenAIRealtimeVoiceAdapter.js +1 -2
- package/dist/assistant-transport.js +1 -2
- package/dist/cloud-renderer/CloudRendererHost.js +1 -2
- package/dist/context/ReadonlyStore.js +1 -2
- package/dist/context/providers/MessageProvider.js +1 -2
- package/dist/context/providers/ThreadViewportProvider.js +1 -2
- package/dist/context/react/ThreadViewportContext.js +1 -2
- package/dist/context/react/utils/createContextHook.js +1 -2
- package/dist/context/react/utils/createContextStoreHook.js +1 -2
- package/dist/context/stores/ThreadViewport.js +1 -2
- package/dist/devtools/DevToolsHooks.js +1 -2
- package/dist/hooks/useMessageQuote.js +1 -2
- package/dist/hooks/useMessageTiming.js +1 -2
- package/dist/hooks/useToolCallElapsed.js +1 -2
- package/dist/internal.js +1 -2
- package/dist/legacy-runtime/AssistantRuntimeProvider.js +1 -2
- package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/mcp-apps/McpAppRenderer.js +3 -3
- package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/mcp-apps/McpAppsRemoteHost.js +1 -2
- package/dist/mcp-apps/app-frame.js +1 -2
- package/dist/mcp-apps/bridge.js +1 -2
- package/dist/mcp-apps/csp.js +1 -2
- package/dist/mcp-apps/types.js +1 -2
- package/dist/mcp-apps/utils.js +1 -2
- package/dist/model-context/frame/useAssistantFrameHost.js +1 -2
- package/dist/model-context/makeAssistantVisible.js +1 -2
- package/dist/primitives/actionBar/ActionBarCopy.js +1 -2
- package/dist/primitives/actionBar/ActionBarEdit.js +1 -2
- package/dist/primitives/actionBar/ActionBarExportMarkdown.js +1 -2
- package/dist/primitives/actionBar/ActionBarFeedbackNegative.js +1 -2
- package/dist/primitives/actionBar/ActionBarFeedbackPositive.js +1 -2
- package/dist/primitives/actionBar/ActionBarInteractionContext.js +1 -2
- package/dist/primitives/actionBar/ActionBarReload.js +1 -2
- package/dist/primitives/actionBar/ActionBarRoot.js +1 -2
- package/dist/primitives/actionBar/ActionBarSpeak.js +1 -2
- package/dist/primitives/actionBar/ActionBarStopSpeaking.js +1 -2
- package/dist/primitives/actionBar/useActionBarFloatStatus.js +1 -2
- package/dist/primitives/actionBar.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreContent.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreItem.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreRoot.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreSeparator.js +1 -2
- package/dist/primitives/actionBarMore/ActionBarMoreTrigger.js +1 -2
- package/dist/primitives/actionBarMore/scope.js +1 -2
- package/dist/primitives/actionBarMore.js +1 -2
- package/dist/primitives/assistantModal/AssistantModalAnchor.js +1 -2
- package/dist/primitives/assistantModal/AssistantModalContent.js +1 -2
- package/dist/primitives/assistantModal/AssistantModalRoot.js +1 -2
- package/dist/primitives/assistantModal/AssistantModalTrigger.js +1 -2
- package/dist/primitives/assistantModal/popoverRenderPrimitives.js +1 -2
- package/dist/primitives/assistantModal/scope.js +1 -2
- package/dist/primitives/assistantModal.js +1 -2
- package/dist/primitives/attachment/AttachmentName.js +1 -2
- package/dist/primitives/attachment/AttachmentRemove.js +1 -2
- package/dist/primitives/attachment/AttachmentRoot.js +1 -2
- package/dist/primitives/attachment/AttachmentThumb.js +1 -2
- package/dist/primitives/attachment.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerCount.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerNext.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerNumber.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerPrevious.js +1 -2
- package/dist/primitives/branchPicker/BranchPickerRoot.js +1 -2
- package/dist/primitives/branchPicker.js +1 -2
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts +5 -4
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.d.ts.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js +57 -20
- package/dist/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.js.map +1 -1
- package/dist/primitives/chainOfThought/ChainOfThoughtRoot.js +1 -2
- package/dist/primitives/chainOfThought.js +1 -2
- package/dist/primitives/composer/ComposerAddAttachment.js +1 -2
- package/dist/primitives/composer/ComposerAttachmentDropzone.js +1 -2
- package/dist/primitives/composer/ComposerCancel.js +1 -2
- package/dist/primitives/composer/ComposerCompactContext.js +1 -2
- package/dist/primitives/composer/ComposerDictate.js +1 -2
- package/dist/primitives/composer/ComposerDictationTranscript.js +1 -2
- package/dist/primitives/composer/ComposerInput.js +1 -2
- package/dist/primitives/composer/ComposerInputPluginContext.js +1 -2
- package/dist/primitives/composer/ComposerQuote.js +1 -2
- package/dist/primitives/composer/ComposerResume.js +1 -2
- package/dist/primitives/composer/ComposerRoot.js +1 -2
- package/dist/primitives/composer/ComposerSend.js +1 -2
- package/dist/primitives/composer/ComposerStopDictation.js +1 -2
- package/dist/primitives/composer/composerInputSelector.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopover.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverBack.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverCategories.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverItems.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverResource.js +1 -2
- package/dist/primitives/composer/trigger/TriggerPopoverRootContext.js +1 -2
- package/dist/primitives/composer/trigger/detectTrigger.js +1 -2
- package/dist/primitives/composer/trigger/index.js +1 -2
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js +1 -2
- package/dist/primitives/composer/trigger/triggerDetectionResource.js +1 -2
- package/dist/primitives/composer/trigger/triggerKeyboardResource.js +1 -2
- package/dist/primitives/composer/trigger/triggerNavigationResource.js +1 -2
- package/dist/primitives/composer/trigger/triggerSelectionResource.js +1 -2
- package/dist/primitives/composer/useComposerCancelWithFocus.js +1 -2
- package/dist/primitives/composer/useComposerInputState.js +1 -2
- package/dist/primitives/composer.js +1 -2
- package/dist/primitives/dropdownMenuRenderPrimitives.js +1 -2
- package/dist/primitives/error/ErrorMessage.js +1 -2
- package/dist/primitives/error/ErrorRoot.js +1 -2
- package/dist/primitives/error.js +1 -2
- package/dist/primitives/message/MessageError.js +1 -2
- package/dist/primitives/message/MessageIf.js +1 -2
- package/dist/primitives/message/MessageParts.js +1 -2
- package/dist/primitives/message/MessagePartsGrouped.js +1 -2
- package/dist/primitives/message/MessageRoot.js +1 -2
- package/dist/primitives/message.js +1 -2
- package/dist/primitives/messagePart/MessagePartImage.js +1 -2
- package/dist/primitives/messagePart/MessagePartText.js +1 -2
- package/dist/primitives/messagePart/useMessagePartData.js +1 -2
- package/dist/primitives/messagePart/useMessagePartFile.js +1 -2
- package/dist/primitives/messagePart/useMessagePartImage.js +1 -2
- package/dist/primitives/messagePart/useMessagePartReasoning.js +1 -2
- package/dist/primitives/messagePart/useMessagePartSource.js +1 -2
- package/dist/primitives/messagePart/useMessagePartText.js +1 -2
- package/dist/primitives/messagePart.js +1 -2
- package/dist/primitives/queueItem/QueueItemRemove.js +1 -2
- package/dist/primitives/queueItem/QueueItemSteer.js +1 -2
- package/dist/primitives/queueItem/QueueItemText.js +1 -2
- package/dist/primitives/queueItem.js +1 -2
- package/dist/primitives/reasoning/useScrollLock.d.ts.map +1 -1
- package/dist/primitives/reasoning/useScrollLock.js +41 -25
- package/dist/primitives/reasoning/useScrollLock.js.map +1 -1
- package/dist/primitives/selectionToolbar/SelectionToolbarQuote.js +1 -2
- package/dist/primitives/selectionToolbar/SelectionToolbarRoot.js +1 -2
- package/dist/primitives/selectionToolbar.js +1 -2
- package/dist/primitives/suggestion/SuggestionDescription.js +1 -2
- package/dist/primitives/suggestion/SuggestionTitle.js +1 -2
- package/dist/primitives/suggestion/SuggestionTrigger.js +1 -2
- package/dist/primitives/suggestion.js +1 -2
- package/dist/primitives/thread/ThreadEmpty.js +1 -2
- package/dist/primitives/thread/ThreadIf.js +1 -2
- package/dist/primitives/thread/ThreadLoadEarlier.js +1 -2
- package/dist/primitives/thread/ThreadRoot.js +1 -2
- package/dist/primitives/thread/ThreadRootElementContext.js +1 -2
- package/dist/primitives/thread/ThreadScrollToBottom.js +1 -2
- package/dist/primitives/thread/ThreadSuggestion.js +1 -2
- package/dist/primitives/thread/ThreadViewport.js +1 -2
- package/dist/primitives/thread/ThreadViewportFooter.js +1 -2
- package/dist/primitives/thread/topAnchor/computeTopAnchorSlack.js +1 -2
- package/dist/primitives/thread/topAnchor/createReserveObservers.js +1 -2
- package/dist/primitives/thread/topAnchor/mountTopAnchorReserve.js +1 -2
- package/dist/primitives/thread/topAnchor/topAnchorTurn.js +1 -2
- package/dist/primitives/thread/topAnchor/topAnchorUtils.js +1 -2
- package/dist/primitives/thread/topAnchor/useTopAnchorReserve.js +1 -2
- package/dist/primitives/thread/useThreadViewportAutoScroll.js +1 -2
- package/dist/primitives/thread.js +1 -2
- package/dist/primitives/threadList/ThreadListLoadMore.js +1 -2
- package/dist/primitives/threadList/ThreadListNew.js +1 -2
- package/dist/primitives/threadList/ThreadListRoot.js +1 -2
- package/dist/primitives/threadList.js +1 -2
- package/dist/primitives/threadListFocusGroup.js +1 -2
- package/dist/primitives/threadListItem/ThreadListItemArchive.js +1 -2
- package/dist/primitives/threadListItem/ThreadListItemDelete.js +1 -2
- package/dist/primitives/threadListItem/ThreadListItemRoot.d.ts.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemRoot.js +2 -3
- package/dist/primitives/threadListItem/ThreadListItemRoot.js.map +1 -1
- package/dist/primitives/threadListItem/ThreadListItemTrigger.js +1 -2
- package/dist/primitives/threadListItem/ThreadListItemUnarchive.js +1 -2
- package/dist/primitives/threadListItem.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreContent.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreItem.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreRoot.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreSeparator.js +1 -2
- package/dist/primitives/threadListItemMore/ThreadListItemMoreTrigger.js +1 -2
- package/dist/primitives/threadListItemMore/scope.js +1 -2
- package/dist/primitives/threadListItemMore.js +1 -2
- package/dist/sandbox-host/SandboxHost.js +1 -2
- package/dist/unstable/useComposerInput.js +1 -2
- package/dist/unstable/useComposerInputHistory.js +1 -2
- package/dist/unstable/useLiveCompletionAdapter.js +1 -2
- package/dist/unstable/useMentionAdapter.js +1 -2
- package/dist/unstable/useMessageStallDetection.js +1 -2
- package/dist/unstable/useModelContextSnapshot.js +1 -2
- package/dist/unstable/useSlashCommandAdapter.js +1 -2
- package/dist/unstable/webmcp/WebMcpRegistrationResource.js +1 -2
- package/dist/unstable/webmcp/convertTools.js +1 -2
- package/dist/unstable/webmcp/useWebMcpProvider.js +1 -2
- package/dist/unstable/webmcp/webmcp-host.js +1 -2
- package/dist/utils/Primitive.js +1 -2
- package/dist/utils/createActionButton.js +1 -2
- package/dist/utils/getSelectionMessageId.js +1 -2
- package/dist/utils/hooks/useManagedRef.js +1 -2
- package/dist/utils/hooks/useMediaQuery.js +1 -2
- package/dist/utils/hooks/useOnScrollToBottom.js +1 -2
- package/dist/utils/hooks/useSizeHandle.js +1 -2
- package/dist/utils/isCompositionKey.js +1 -2
- package/dist/utils/smooth/SmoothContext.js +1 -2
- package/dist/utils/smooth/useSmooth.d.ts.map +1 -1
- package/dist/utils/smooth/useSmooth.js +11 -4
- package/dist/utils/smooth/useSmooth.js.map +1 -1
- package/dist/utils/useIsomorphicLayoutEffect.js +0 -1
- package/package.json +6 -6
- package/src/mcp-apps/McpAppRenderer.composer.test.tsx +111 -0
- package/src/mcp-apps/McpAppRenderer.test.tsx +24 -23
- package/src/mcp-apps/McpAppRenderer.tsx +9 -1
- package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.test.tsx +91 -0
- package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.tsx +54 -0
- package/src/primitives/reasoning/useScrollLock.test.tsx +71 -2
- package/src/primitives/reasoning/useScrollLock.ts +78 -51
- package/src/primitives/threadListItem/ThreadListItemRoot.tsx +4 -1
- package/src/primitives/threadListItem/ThreadListKeyboardNav.test.tsx +25 -0
- package/src/utils/smooth/useSmooth.test.tsx +113 -4
- package/src/utils/smooth/useSmooth.ts +16 -2
- package/src/primitives/chainOfThought/ChainOfThoughtAccordionTrigger.ts +0 -49
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// \0rolldown/runtime.js
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __exportAll = (all, no_symbols) => {
|
|
4
4
|
let target = {};
|
|
@@ -9,5 +9,4 @@ var __exportAll = (all, no_symbols) => {
|
|
|
9
9
|
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
10
10
|
return target;
|
|
11
11
|
};
|
|
12
|
-
//#endregion
|
|
13
12
|
export { __exportAll };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createVoiceSession } from "@assistant-ui/core";
|
|
2
|
-
|
|
2
|
+
// src/adapters/OpenAIRealtimeVoiceAdapter.ts
|
|
3
3
|
const asRecord = (value) => value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Connects browser microphone audio directly to OpenAI Realtime over WebRTC.
|
|
@@ -291,7 +291,6 @@ var OpenAIRealtimeVoiceAdapter = class {
|
|
|
291
291
|
});
|
|
292
292
|
}
|
|
293
293
|
};
|
|
294
|
-
//#endregion
|
|
295
294
|
export { OpenAIRealtimeVoiceAdapter };
|
|
296
295
|
|
|
297
296
|
//# sourceMappingURL=OpenAIRealtimeVoiceAdapter.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
3
3
|
import { useAssistantTransportRuntime as useAssistantTransportRuntime$1, useAssistantTransportSendCommand as useAssistantTransportSendCommand$1, useAssistantTransportState as useAssistantTransportState$1 } from "@assistant-ui/core/react";
|
|
4
|
-
|
|
4
|
+
// src/assistant-transport.ts
|
|
5
5
|
const useAssistantTransportRuntime = (options) => {
|
|
6
6
|
return useAssistantTransportRuntime$1(options);
|
|
7
7
|
};
|
|
@@ -21,7 +21,6 @@ const useAssistantTransportSendCommand = () => {
|
|
|
21
21
|
function useAssistantTransportState(selector = (state) => state) {
|
|
22
22
|
return useAssistantTransportState$1(selector);
|
|
23
23
|
}
|
|
24
|
-
//#endregion
|
|
25
24
|
export { useAssistantTransportRuntime, useAssistantTransportSendCommand, useAssistantTransportState };
|
|
26
25
|
|
|
27
26
|
//# sourceMappingURL=assistant-transport.js.map
|
|
@@ -6,7 +6,7 @@ import { Component, useEffect, useRef, useState, useSyncExternalStore } from "@a
|
|
|
6
6
|
import { AuiConfig, AuiProvider, useAui } from "@assistant-ui/store";
|
|
7
7
|
import { resource } from "@assistant-ui/tap";
|
|
8
8
|
import { jsx } from "react/jsx-runtime";
|
|
9
|
-
|
|
9
|
+
// src/cloud-renderer/CloudRendererHost.tsx
|
|
10
10
|
const CHANNEL = "assistant-ui/cloud-renderer";
|
|
11
11
|
const toOrigin = (value) => {
|
|
12
12
|
try {
|
|
@@ -284,7 +284,6 @@ function _temp2(origin, message) {
|
|
|
284
284
|
function _temp(value) {
|
|
285
285
|
return toOrigin(value) ?? [];
|
|
286
286
|
}
|
|
287
|
-
//#endregion
|
|
288
287
|
export { CloudRendererHost };
|
|
289
288
|
|
|
290
289
|
//# sourceMappingURL=CloudRendererHost.js.map
|
|
@@ -3,7 +3,7 @@ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
|
3
3
|
import { AuiConfig, AuiProvider, useAui } from "@assistant-ui/store";
|
|
4
4
|
import { jsx } from "react/jsx-runtime";
|
|
5
5
|
import { ThreadMessageClient } from "@assistant-ui/core/store";
|
|
6
|
-
|
|
6
|
+
// src/context/providers/MessageProvider.tsx
|
|
7
7
|
const MessageProvider = (t0) => {
|
|
8
8
|
const $ = c(4);
|
|
9
9
|
const { children, ...props } = t0;
|
|
@@ -23,7 +23,6 @@ const MessageProvider = (t0) => {
|
|
|
23
23
|
} else t1 = $[3];
|
|
24
24
|
return t1;
|
|
25
25
|
};
|
|
26
|
-
//#endregion
|
|
27
26
|
export { MessageProvider };
|
|
28
27
|
|
|
29
28
|
//# sourceMappingURL=MessageProvider.js.map
|
|
@@ -5,7 +5,7 @@ import { writableStore } from "../ReadonlyStore.js";
|
|
|
5
5
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
6
6
|
import { useEffect, useState } from "@assistant-ui/tap/react-shim";
|
|
7
7
|
import { jsx } from "react/jsx-runtime";
|
|
8
|
-
|
|
8
|
+
// src/context/providers/ThreadViewportProvider.tsx
|
|
9
9
|
const useThreadViewportStoreValue = (options) => {
|
|
10
10
|
const $ = c(11);
|
|
11
11
|
let t0;
|
|
@@ -87,7 +87,6 @@ const ThreadPrimitiveViewportProvider = (t0) => {
|
|
|
87
87
|
} else t4 = $[6];
|
|
88
88
|
return t4;
|
|
89
89
|
};
|
|
90
|
-
//#endregion
|
|
91
90
|
export { ThreadPrimitiveViewportProvider };
|
|
92
91
|
|
|
93
92
|
//# sourceMappingURL=ThreadViewportProvider.js.map
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
import { createContextHook } from "./utils/createContextHook.js";
|
|
3
3
|
import { createContextStoreHook } from "./utils/createContextStoreHook.js";
|
|
4
4
|
import { createContext } from "@assistant-ui/tap/react-shim";
|
|
5
|
-
|
|
5
|
+
// src/context/react/ThreadViewportContext.ts
|
|
6
6
|
const ThreadViewportContext = createContext(null);
|
|
7
7
|
const useThreadViewportContext = createContextHook(ThreadViewportContext, "ThreadPrimitive.Viewport");
|
|
8
8
|
const { useThreadViewport, useThreadViewportStore } = createContextStoreHook(useThreadViewportContext, "useThreadViewport");
|
|
9
|
-
//#endregion
|
|
10
9
|
export { ThreadViewportContext, useThreadViewport, useThreadViewportStore };
|
|
11
10
|
|
|
12
11
|
//# sourceMappingURL=ThreadViewportContext.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useContext } from "@assistant-ui/tap/react-shim";
|
|
3
|
-
|
|
3
|
+
// src/context/react/utils/createContextHook.ts
|
|
4
4
|
/**
|
|
5
5
|
* Creates a context hook with optional support.
|
|
6
6
|
* @param context - The React context to consume.
|
|
@@ -15,7 +15,6 @@ function createContextHook(context, providerName) {
|
|
|
15
15
|
}
|
|
16
16
|
return useContextHook;
|
|
17
17
|
}
|
|
18
|
-
//#endregion
|
|
19
18
|
export { createContextHook };
|
|
20
19
|
|
|
21
20
|
//# sourceMappingURL=createContextHook.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/context/react/utils/createContextStoreHook.ts
|
|
2
2
|
/**
|
|
3
3
|
* Creates hooks for accessing a store within a context.
|
|
4
4
|
* @param contextHook - The hook to access the context.
|
|
@@ -28,7 +28,6 @@ function createContextStoreHook(contextHook, contextKey) {
|
|
|
28
28
|
[`${contextKey}Store`]: useStoreStoreHook
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
-
//#endregion
|
|
32
31
|
export { createContextStoreHook };
|
|
33
32
|
|
|
34
33
|
//# sourceMappingURL=createContextStoreHook.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { create } from "zustand";
|
|
3
3
|
import { notifyEventListeners } from "@assistant-ui/core/internal";
|
|
4
4
|
import { createThreadViewportAutoScroll } from "@assistant-ui/store/client";
|
|
5
|
-
|
|
5
|
+
// src/context/stores/ThreadViewport.ts
|
|
6
6
|
const createSizeRegistry = (onChange) => {
|
|
7
7
|
const entries = /* @__PURE__ */ new Map();
|
|
8
8
|
const recalculate = () => {
|
|
@@ -125,7 +125,6 @@ const makeThreadViewportStore = (options = {}) => {
|
|
|
125
125
|
viewportAutoScroll.set(store, autoScroll);
|
|
126
126
|
return store;
|
|
127
127
|
};
|
|
128
|
-
//#endregion
|
|
129
128
|
export { getThreadViewportAutoScroll, makeThreadViewportStore };
|
|
130
129
|
|
|
131
130
|
//# sourceMappingURL=ThreadViewport.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { notifyEventListeners } from "@assistant-ui/core/internal";
|
|
2
|
-
|
|
2
|
+
// src/devtools/DevToolsHooks.ts
|
|
3
3
|
let cachedHook;
|
|
4
4
|
const getHook = () => {
|
|
5
5
|
if (cachedHook) return cachedHook;
|
|
@@ -79,7 +79,6 @@ var DevToolsProviderApi = class DevToolsProviderApi {
|
|
|
79
79
|
};
|
|
80
80
|
}
|
|
81
81
|
};
|
|
82
|
-
//#endregion
|
|
83
82
|
export { DevToolsHooks, DevToolsProviderApi };
|
|
84
83
|
|
|
85
84
|
//# sourceMappingURL=DevToolsHooks.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { getMessageQuote } from "@assistant-ui/core/react";
|
|
3
3
|
import { useAuiState } from "@assistant-ui/store";
|
|
4
|
-
|
|
4
|
+
// src/hooks/useMessageQuote.ts
|
|
5
5
|
/**
|
|
6
6
|
* Hook that returns the quote info for the current message, if any.
|
|
7
7
|
*
|
|
@@ -19,7 +19,6 @@ import { useAuiState } from "@assistant-ui/store";
|
|
|
19
19
|
const useMessageQuote = () => {
|
|
20
20
|
return useAuiState(getMessageQuote);
|
|
21
21
|
};
|
|
22
|
-
//#endregion
|
|
23
22
|
export { useMessageQuote };
|
|
24
23
|
|
|
25
24
|
//# sourceMappingURL=useMessageQuote.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { useAuiState } from "@assistant-ui/store";
|
|
3
|
-
|
|
3
|
+
// src/hooks/useMessageTiming.ts
|
|
4
4
|
/**
|
|
5
5
|
* Hook that returns timing information for the current assistant message.
|
|
6
6
|
*
|
|
@@ -21,7 +21,6 @@ const useMessageTiming = () => {
|
|
|
21
21
|
function _temp(s) {
|
|
22
22
|
return s.message.role === "assistant" ? s.message.metadata?.timing : void 0;
|
|
23
23
|
}
|
|
24
|
-
//#endregion
|
|
25
24
|
export { useMessageTiming };
|
|
26
25
|
|
|
27
26
|
//# sourceMappingURL=useMessageTiming.js.map
|
|
@@ -3,7 +3,7 @@ import { useIsomorphicLayoutEffect } from "../utils/useIsomorphicLayoutEffect.js
|
|
|
3
3
|
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
4
4
|
import { useState } from "@assistant-ui/tap/react-shim";
|
|
5
5
|
import { useAuiState } from "@assistant-ui/store";
|
|
6
|
-
|
|
6
|
+
// src/hooks/useToolCallElapsed.ts
|
|
7
7
|
/**
|
|
8
8
|
* Hook that returns the elapsed wall-clock time of the current tool call in
|
|
9
9
|
* milliseconds, ticking once per second while the call runs.
|
|
@@ -61,7 +61,6 @@ function _temp2(s_0) {
|
|
|
61
61
|
const part_0 = s_0.optional.part;
|
|
62
62
|
return part_0?.type === "tool-call" && part_0.status.type === "running";
|
|
63
63
|
}
|
|
64
|
-
//#endregion
|
|
65
64
|
export { useToolCallElapsed };
|
|
66
65
|
|
|
67
66
|
//# sourceMappingURL=useToolCallElapsed.js.map
|
package/dist/internal.js
CHANGED
|
@@ -4,7 +4,7 @@ import { useSmoothStatus, withSmoothContextProvider } from "./utils/smooth/Smoot
|
|
|
4
4
|
import { useSmooth } from "./utils/smooth/useSmooth.js";
|
|
5
5
|
import { splitLocalRuntimeOptions } from "@assistant-ui/core/react";
|
|
6
6
|
import { AssistantRuntimeImpl, BaseAssistantRuntimeCore, CompositeContextProvider, DefaultThreadComposerRuntimeCore, MessageRepository, ThreadRuntimeImpl, getAutoStatus } from "@assistant-ui/core/internal";
|
|
7
|
-
|
|
7
|
+
// src/internal.ts
|
|
8
8
|
var internal_exports = /* @__PURE__ */ __exportAll({
|
|
9
9
|
AssistantRuntimeImpl: () => AssistantRuntimeImpl,
|
|
10
10
|
BaseAssistantRuntimeCore: () => BaseAssistantRuntimeCore,
|
|
@@ -19,7 +19,6 @@ var internal_exports = /* @__PURE__ */ __exportAll({
|
|
|
19
19
|
useSmoothStatus: () => useSmoothStatus,
|
|
20
20
|
withSmoothContextProvider: () => withSmoothContextProvider
|
|
21
21
|
});
|
|
22
|
-
//#endregion
|
|
23
22
|
export { AssistantRuntimeImpl, BaseAssistantRuntimeCore, CompositeContextProvider, DefaultThreadComposerRuntimeCore, MessageRepository, ThreadRuntimeImpl, getAutoStatus, internal_exports, splitLocalRuntimeOptions, useComposerInputPluginRegistryOptional, useSmooth, useSmoothStatus, withSmoothContextProvider };
|
|
24
23
|
|
|
25
24
|
//# sourceMappingURL=internal.js.map
|
|
@@ -6,7 +6,7 @@ import { AssistantProviderBase } from "@assistant-ui/core/react";
|
|
|
6
6
|
import { memo, useEffect } from "@assistant-ui/tap/react-shim";
|
|
7
7
|
import { useAui } from "@assistant-ui/store";
|
|
8
8
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
-
|
|
9
|
+
// src/legacy-runtime/AssistantRuntimeProvider.tsx
|
|
10
10
|
const DevToolsRegistration = () => {
|
|
11
11
|
const $ = c(3);
|
|
12
12
|
const aui = useAui();
|
|
@@ -60,7 +60,6 @@ const AssistantRuntimeProviderImpl = (t0) => {
|
|
|
60
60
|
return t4;
|
|
61
61
|
};
|
|
62
62
|
const AssistantRuntimeProvider = memo(AssistantRuntimeProviderImpl);
|
|
63
|
-
//#endregion
|
|
64
63
|
export { AssistantRuntimeProvider, AssistantRuntimeProviderImpl };
|
|
65
64
|
|
|
66
65
|
//# sourceMappingURL=AssistantRuntimeProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpAppRenderer.d.ts","sourceRoot":"","sources":["../../src/mcp-apps/McpAppRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,KAAK,EAGV,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,4BAA4B,EAE7B,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEhF,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EAEd,mBAAmB,EACnB,WAAW,EACZ,mBAAgB;AAIjB;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uEAAuE;IACvE,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,2GAA2G;IAC3G,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,IAAI,CACb,oBAAoB,EACpB,UAAU,GAAG,cAAc,GAAG,eAAe,CAC9C,CAAC;IACF,wGAAwG;IACxG,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,sEAAsE;IACtE,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,uEAAuE;IACvE,aAAa,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,GAAG;IACtD;;;;OAIG;IACH,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACnC;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,iBAAiB,CAAC;CAC5D,CAAC;
|
|
1
|
+
{"version":3,"file":"McpAppRenderer.d.ts","sourceRoot":"","sources":["../../src/mcp-apps/McpAppRenderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAE7E,OAAO,KAAK,EAGV,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EACV,4BAA4B,EAE7B,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEhF,OAAO,KAAK,EACV,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EAEd,mBAAmB,EACnB,WAAW,EACZ,mBAAgB;AAIjB;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,uEAAuE;IACvE,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,2GAA2G;IAC3G,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,IAAI,CACb,oBAAoB,EACpB,UAAU,GAAG,cAAc,GAAG,eAAe,CAC9C,CAAC;IACF,wGAAwG;IACxG,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,sEAAsE;IACtE,eAAe,CAAC,EAAE,SAAS,CAAC;IAC5B,uEAAuE;IACvE,aAAa,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,iBAAiB,GAAG;IACtD;;;;OAIG;IACH,IAAI,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;IACnC;;;;;;;;;OASG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,iBAAiB,CAAC;CAC5D,CAAC;AAiTF,eAAO,MAAM,cAAc;qBA3BL,4BAA4B;oCA2BO,CAAC"}
|
|
@@ -8,7 +8,7 @@ import { resource, useResource } from "@assistant-ui/tap";
|
|
|
8
8
|
import { create } from "zustand";
|
|
9
9
|
import { isRecord } from "@assistant-ui/core/internal";
|
|
10
10
|
import { Fragment, jsx } from "react/jsx-runtime";
|
|
11
|
-
|
|
11
|
+
// src/mcp-apps/McpAppRenderer.tsx
|
|
12
12
|
const isSameOptions = (a, b) => {
|
|
13
13
|
const aKeys = Object.keys(a).filter((key) => key !== "host");
|
|
14
14
|
const bKeys = Object.keys(b).filter((key) => key !== "host");
|
|
@@ -123,7 +123,8 @@ function InlineRenderer({ part, useRendererStore }) {
|
|
|
123
123
|
ok: false,
|
|
124
124
|
reason: result.reason
|
|
125
125
|
};
|
|
126
|
-
aui.thread.
|
|
126
|
+
const composer = aui.thread.composer();
|
|
127
|
+
composer.setText([composer.getState().text, result.content.map((part_0) => part_0.text).join("\n")].filter((part_1) => part_1.trim()).join(" "));
|
|
127
128
|
return { ok: true };
|
|
128
129
|
}),
|
|
129
130
|
callTool: (params_0) => useRendererStore.getState().host.callTool({
|
|
@@ -205,7 +206,6 @@ const useMcpAppRenderer = (options) => {
|
|
|
205
206
|
}, [useRendererStore]) };
|
|
206
207
|
};
|
|
207
208
|
const McpAppRenderer = resource(useMcpAppRenderer);
|
|
208
|
-
//#endregion
|
|
209
209
|
export { McpAppRenderer };
|
|
210
210
|
|
|
211
211
|
//# sourceMappingURL=McpAppRenderer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"McpAppRenderer.js","names":["useEffect","useMemo","useRef","useState","ReactNode","useIsomorphicLayoutEffect","McpAppMetadata","TextMessagePart","ToolCallMessagePart","ToolCallMessagePartComponent","ToolCallMessagePartProps","useAui","create","StoreApi","UseBoundStore","useResource","resource","ResourceElement","McpAppFrame","McpAppBridgeHandlers","McpAppHostContext","McpAppHostInfo","McpAppResource","McpAppSandboxConfig","McpAppsHost","getMcpAppFromToolPart","isRecord","McpAppPartOptions","sandbox","maxHeight","hostInfo","hostContext","handlers","Omit","fallback","loadingFallback","errorFallback","error","Error","McpAppRendererOptions","host","forPart","part","LoadedResourceState","resourceUri","serverId","RendererState","options","UseRendererStore","isSameOptions","a","b","aKeys","Object","keys","filter","key","bKeys","length","aValues","Record","bValues","every","hasOwn","is","getInput","status","type","argsText","args","undefined","defaultOpenLink","url","window","open","extractSendMessageTexts","params","obj","content","Array","isArray","index","Number","isInteger","String","map","block","text","extractSendMessageContent","reason","texts","resolvePartOptions","overrides","InlineRenderer","useRendererStore","aui","rendererOptions","state","opts","app","cachedAppRef","current","appForRender","loadedResource","setLoadedResource","callerHandlers","cancelled","targetHost","targetUri","targetServerId","loadResource","Promise","resolve","getState","res","uri","bridgeHandlers","openLink","sendMessage","result","isError","ok","thread","append","callTool","readResource","listResources","loadedResourceForApp","appResource","useMcpAppRenderer","render","setState","prev","Render","props","displayName","McpAppRenderer"],"sources":["../../src/mcp-apps/McpAppRenderer.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../utils/useIsomorphicLayoutEffect\";\nimport type {\n McpAppMetadata,\n TextMessagePart,\n ToolCallMessagePart,\n} from \"@assistant-ui/core\";\nimport type {\n ToolCallMessagePartComponent,\n ToolCallMessagePartProps,\n} from \"@assistant-ui/core/react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { create, type StoreApi, type UseBoundStore } from \"zustand\";\n\nimport { useResource, resource, type ResourceElement } from \"@assistant-ui/tap\";\nimport { McpAppFrame } from \"./app-frame\";\nimport type {\n McpAppBridgeHandlers,\n McpAppHostContext,\n McpAppHostInfo,\n McpAppResource,\n McpAppSandboxConfig,\n McpAppsHost,\n} from \"./types\";\nimport { getMcpAppFromToolPart } from \"./utils\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\n\n/**\n * Options that apply to a single MCP app. `McpAppRenderer` takes them as\n * thread-wide defaults, and its `forPart` resolver overrides them for one part.\n */\nexport type McpAppPartOptions = {\n /** Sandbox + container styling. Passes through to SafeContentFrame. */\n sandbox?: McpAppSandboxConfig;\n /**\n * Upper bound (in pixels) applied to the widget-driven auto-resize height.\n * Defaults to 800.\n */\n maxHeight?: number;\n /** Identifies the host to the widget in the `ui/initialize` response. */\n hostInfo?: McpAppHostInfo;\n /** Delivered to the widget on initialize and pushed via `notifications/host_context/changed` on change. */\n hostContext?: McpAppHostContext;\n /**\n * Optional widget interaction and lifecycle handlers. Data-plane handlers\n * (`callTool`, `readResource`, `listResources`) always use `host`.\n *\n * Which handlers a widget may call is captured when its frame mounts, so a\n * `forPart` resolver returns the same handler keys for a part on every\n * render even when the implementations change.\n */\n handlers?: Omit<\n McpAppBridgeHandlers,\n \"callTool\" | \"readResource\" | \"listResources\"\n >;\n /** Rendered when no MCP app is on the part, or while load is in flight / failed (unless overridden). */\n fallback?: ReactNode;\n /** Rendered while the resource is loading. Defaults to `fallback`. */\n loadingFallback?: ReactNode;\n /** Rendered when the resource load rejects. Defaults to `fallback`. */\n errorFallback?: ReactNode | ((error: Error) => ReactNode);\n};\n\nexport type McpAppRendererOptions = McpAppPartOptions & {\n /**\n * Provides the data-plane operations the widget can request\n * (`loadResource`, `callTool`, `readResource`, `listResources`). Use\n * `McpAppsRemoteHost({ url })` for the default HTTP-route convention.\n */\n host: ResourceElement<McpAppsHost>;\n /**\n * Resolves the options for one part. Each returned value replaces the\n * thread-wide option of the same name, so a host can give every MCP app its\n * own display mode and answer `requestDisplayMode` for the part that asked.\n *\n * `handlers` is the exception and merges per key. Its keys are capabilities\n * negotiated with the widget rather than data, so replacing the whole bag to\n * add one handler would withdraw the others from that part's widget with\n * nothing to observe it by.\n */\n forPart?: (part: ToolCallMessagePart) => McpAppPartOptions;\n};\n\ntype LoadedResourceState = {\n host: McpAppsHost;\n resourceUri: string;\n serverId?: string;\n resource?: McpAppResource;\n error?: Error;\n};\n\ntype RendererState = {\n host: McpAppsHost;\n options: McpAppRendererOptions;\n};\n\ntype UseRendererStore = UseBoundStore<StoreApi<RendererState>>;\n\n// Callers pass options as an object literal, so the resource hands this a fresh\n// identity on every run; comparing the values keeps an unchanged run from\n// re-rendering every mounted part. `host` is excluded because it is an element\n// rebuilt on every run, and the store carries the resolved host separately.\nconst isSameOptions = (\n a: McpAppRendererOptions,\n b: McpAppRendererOptions,\n): boolean => {\n const aKeys = Object.keys(a).filter((key) => key !== \"host\");\n const bKeys = Object.keys(b).filter((key) => key !== \"host\");\n if (aKeys.length !== bKeys.length) return false;\n const aValues = a as Record<string, unknown>;\n const bValues = b as Record<string, unknown>;\n return aKeys.every(\n (key) =>\n Object.hasOwn(bValues, key) && Object.is(aValues[key], bValues[key]),\n );\n};\n\nfunction getInput(part: {\n status: { type: string };\n argsText: string;\n args: unknown;\n}): unknown {\n if (\n part.status.type === \"running\" &&\n (part.argsText === \"\" || part.argsText === \"{}\")\n ) {\n return undefined;\n }\n return part.args;\n}\n\nconst defaultOpenLink = ({ url }: { url: string }) => {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n};\n\nfunction extractSendMessageTexts(params: unknown): string[] | undefined {\n if (typeof params === \"string\") return [params];\n if (!params || typeof params !== \"object\") return undefined;\n const obj = params as Record<string, unknown>;\n if (typeof obj[\"prompt\"] === \"string\") return [obj[\"prompt\"]];\n if (typeof obj[\"text\"] === \"string\") return [obj[\"text\"]];\n if (typeof obj[\"message\"] === \"string\") return [obj[\"message\"]];\n const content = obj[\"content\"];\n if (Array.isArray(content)) {\n return Object.keys(content)\n .filter((key) => {\n const index = Number(key);\n return (\n Number.isInteger(index) &&\n index >= 0 &&\n index < content.length &&\n String(index) === key\n );\n })\n .map((key) => content[Number(key)])\n .filter(\n (block): block is { type: \"text\"; text: string } =>\n isRecord(block) &&\n block[\"type\"] === \"text\" &&\n typeof block[\"text\"] === \"string\",\n )\n .map((block) => block.text);\n }\n return undefined;\n}\n\nfunction extractSendMessageContent(\n params: unknown,\n): { content: TextMessagePart[] } | { reason: string } {\n const texts = extractSendMessageTexts(params);\n if (!texts) return { reason: \"unrecognised params shape\" };\n const content = texts\n .filter((text) => text !== \"\")\n .map((text): TextMessagePart => ({ type: \"text\", text }));\n if (content.length === 0) {\n return { reason: \"no text content to append\" };\n }\n return { content };\n}\n\nfunction resolvePartOptions(\n options: McpAppRendererOptions,\n part: ToolCallMessagePartProps,\n): McpAppRendererOptions {\n const overrides = options.forPart?.(part);\n if (!overrides) return options;\n const handlers =\n options.handlers && overrides.handlers\n ? { ...options.handlers, ...overrides.handlers }\n : (overrides.handlers ?? options.handlers);\n return {\n ...options,\n ...overrides,\n ...(handlers === undefined ? {} : { handlers }),\n };\n}\n\nfunction InlineRenderer({\n part,\n useRendererStore,\n}: {\n part: ToolCallMessagePartProps;\n useRendererStore: UseRendererStore;\n}) {\n const aui = useAui();\n const rendererOptions = useRendererStore((state) => state.options);\n const opts = resolvePartOptions(rendererOptions, part);\n const app = getMcpAppFromToolPart(part);\n const cachedAppRef = useRef<McpAppMetadata | undefined>(undefined);\n useIsomorphicLayoutEffect(() => {\n if (app != null) cachedAppRef.current = app;\n }, [app]);\n const appForRender = app ?? cachedAppRef.current;\n\n const [loadedResource, setLoadedResource] = useState<LoadedResourceState>();\n\n const host = useRendererStore((state) => state.host);\n const resourceUri = appForRender?.resourceUri;\n const serverId = appForRender?.serverId;\n const callerHandlers = opts.handlers;\n useEffect(() => {\n if (resourceUri == null) return;\n let cancelled = false;\n const targetHost = host;\n const targetUri = resourceUri;\n const targetServerId = serverId;\n\n // Host changes are published later in this passive flush. Defer until that\n // publication lands, then verify this effect still owns the current host.\n const loadResource = async () => {\n await Promise.resolve();\n if (cancelled || useRendererStore.getState().host !== targetHost) return;\n try {\n const res = await targetHost.loadResource({\n uri: targetUri,\n ...(targetServerId ? { serverId: targetServerId } : {}),\n });\n if (!cancelled)\n setLoadedResource({\n host: targetHost,\n resourceUri: targetUri,\n ...(targetServerId !== undefined\n ? { serverId: targetServerId }\n : {}),\n resource: res,\n });\n } catch (error: unknown) {\n if (!cancelled) {\n setLoadedResource({\n host: targetHost,\n resourceUri: targetUri,\n ...(targetServerId !== undefined\n ? { serverId: targetServerId }\n : {}),\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n };\n void loadResource();\n\n return () => {\n cancelled = true;\n };\n }, [host, resourceUri, serverId, useRendererStore]);\n\n const bridgeHandlers = useMemo<McpAppBridgeHandlers>(\n () => ({\n ...callerHandlers,\n openLink: callerHandlers?.openLink ?? defaultOpenLink,\n sendMessage:\n callerHandlers?.sendMessage ??\n ((params) => {\n const result = extractSendMessageContent(params);\n if (\"reason\" in result) {\n return { isError: true, ok: false, reason: result.reason };\n }\n aui.thread.append({ content: result.content });\n return { ok: true };\n }),\n callTool: (params) =>\n useRendererStore.getState().host.callTool({\n ...params,\n ...(serverId ? { serverId } : {}),\n }),\n readResource: (params) =>\n useRendererStore.getState().host.readResource({\n ...params,\n ...(serverId ? { serverId } : {}),\n }),\n listResources: (params) => {\n if (!serverId) {\n return useRendererStore.getState().host.listResources(params);\n }\n return useRendererStore.getState().host.listResources({\n ...(isRecord(params) ? params : {}),\n serverId,\n });\n },\n }),\n [aui, callerHandlers, serverId, useRendererStore],\n );\n\n const loadedResourceForApp =\n loadedResource?.host === host &&\n loadedResource?.resourceUri === appForRender?.resourceUri &&\n loadedResource?.serverId === appForRender?.serverId\n ? loadedResource\n : undefined;\n const appResource = loadedResourceForApp?.resource;\n const error = loadedResourceForApp?.error;\n\n const fallback = opts.fallback ?? null;\n if (appForRender == null) {\n return <>{fallback}</>;\n }\n if (error != null) {\n const errorFallback = opts.errorFallback;\n if (errorFallback === undefined) return <>{fallback}</>;\n if (typeof errorFallback === \"function\") return <>{errorFallback(error)}</>;\n return <>{errorFallback}</>;\n }\n if (appResource == null) {\n return <>{opts.loadingFallback ?? fallback}</>;\n }\n\n return (\n <McpAppFrame\n app={appForRender}\n resource={appResource}\n input={getInput(part)}\n output={part.result}\n sandbox={opts.sandbox}\n handlers={bridgeHandlers}\n hostInfo={opts.hostInfo}\n hostContext={opts.hostContext}\n maxHeight={opts.maxHeight}\n />\n );\n}\n\n/**\n * Creates a tool-call renderer for MCP Apps embedded in assistant messages.\n *\n * Compose this into the `Tools` resource through its `mcpApp` option. When a\n * tool-call part carries `mcp.app` metadata for a `ui://` resource, the\n * renderer loads that resource from the configured host and displays it in a\n * sandboxed frame.\n */\nconst useMcpAppRenderer = (\n options: McpAppRendererOptions,\n): { readonly render: ToolCallMessagePartComponent } => {\n const host = useResource(options.host);\n\n // The rendered component identity has to stay stable, or every part remounts\n // its frame; options reach the parts through the store instead of props.\n const [useRendererStore] = useState(() =>\n create<RendererState>(() => ({ host, options })),\n );\n useEffect(() => {\n useRendererStore.setState((prev) =>\n prev.host === host && isSameOptions(prev.options, options)\n ? prev\n : { host, options },\n );\n }, [host, options, useRendererStore]);\n\n const render = useMemo((): ToolCallMessagePartComponent => {\n const Render: ToolCallMessagePartComponent = (props) => (\n <InlineRenderer part={props} useRendererStore={useRendererStore} />\n );\n Render.displayName = \"McpAppRenderer\";\n return Render;\n }, [useRendererStore]);\n\n return { render };\n};\n\nexport const McpAppRenderer = resource(useMcpAppRenderer);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"McpAppRenderer.js","names":["useEffect","useMemo","useRef","useState","ReactNode","useIsomorphicLayoutEffect","McpAppMetadata","TextMessagePart","ToolCallMessagePart","ToolCallMessagePartComponent","ToolCallMessagePartProps","useAui","create","StoreApi","UseBoundStore","useResource","resource","ResourceElement","McpAppFrame","McpAppBridgeHandlers","McpAppHostContext","McpAppHostInfo","McpAppResource","McpAppSandboxConfig","McpAppsHost","getMcpAppFromToolPart","isRecord","McpAppPartOptions","sandbox","maxHeight","hostInfo","hostContext","handlers","Omit","fallback","loadingFallback","errorFallback","error","Error","McpAppRendererOptions","host","forPart","part","LoadedResourceState","resourceUri","serverId","RendererState","options","UseRendererStore","isSameOptions","a","b","aKeys","Object","keys","filter","key","bKeys","length","aValues","Record","bValues","every","hasOwn","is","getInput","status","type","argsText","args","undefined","defaultOpenLink","url","window","open","extractSendMessageTexts","params","obj","content","Array","isArray","index","Number","isInteger","String","map","block","text","extractSendMessageContent","reason","texts","resolvePartOptions","overrides","InlineRenderer","useRendererStore","aui","rendererOptions","state","opts","app","cachedAppRef","current","appForRender","loadedResource","setLoadedResource","callerHandlers","cancelled","targetHost","targetUri","targetServerId","loadResource","Promise","resolve","getState","res","uri","bridgeHandlers","openLink","sendMessage","result","isError","ok","composer","thread","setText","join","trim","callTool","readResource","listResources","loadedResourceForApp","appResource","useMcpAppRenderer","render","setState","prev","Render","props","displayName","McpAppRenderer"],"sources":["../../src/mcp-apps/McpAppRenderer.tsx"],"sourcesContent":["\"use client\";\n\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../utils/useIsomorphicLayoutEffect\";\nimport type {\n McpAppMetadata,\n TextMessagePart,\n ToolCallMessagePart,\n} from \"@assistant-ui/core\";\nimport type {\n ToolCallMessagePartComponent,\n ToolCallMessagePartProps,\n} from \"@assistant-ui/core/react\";\nimport { useAui } from \"@assistant-ui/store\";\nimport { create, type StoreApi, type UseBoundStore } from \"zustand\";\n\nimport { useResource, resource, type ResourceElement } from \"@assistant-ui/tap\";\nimport { McpAppFrame } from \"./app-frame\";\nimport type {\n McpAppBridgeHandlers,\n McpAppHostContext,\n McpAppHostInfo,\n McpAppResource,\n McpAppSandboxConfig,\n McpAppsHost,\n} from \"./types\";\nimport { getMcpAppFromToolPart } from \"./utils\";\nimport { isRecord } from \"@assistant-ui/core/internal\";\n\n/**\n * Options that apply to a single MCP app. `McpAppRenderer` takes them as\n * thread-wide defaults, and its `forPart` resolver overrides them for one part.\n */\nexport type McpAppPartOptions = {\n /** Sandbox + container styling. Passes through to SafeContentFrame. */\n sandbox?: McpAppSandboxConfig;\n /**\n * Upper bound (in pixels) applied to the widget-driven auto-resize height.\n * Defaults to 800.\n */\n maxHeight?: number;\n /** Identifies the host to the widget in the `ui/initialize` response. */\n hostInfo?: McpAppHostInfo;\n /** Delivered to the widget on initialize and pushed via `notifications/host_context/changed` on change. */\n hostContext?: McpAppHostContext;\n /**\n * Optional widget interaction and lifecycle handlers. Data-plane handlers\n * (`callTool`, `readResource`, `listResources`) always use `host`.\n *\n * Which handlers a widget may call is captured when its frame mounts, so a\n * `forPart` resolver returns the same handler keys for a part on every\n * render even when the implementations change.\n */\n handlers?: Omit<\n McpAppBridgeHandlers,\n \"callTool\" | \"readResource\" | \"listResources\"\n >;\n /** Rendered when no MCP app is on the part, or while load is in flight / failed (unless overridden). */\n fallback?: ReactNode;\n /** Rendered while the resource is loading. Defaults to `fallback`. */\n loadingFallback?: ReactNode;\n /** Rendered when the resource load rejects. Defaults to `fallback`. */\n errorFallback?: ReactNode | ((error: Error) => ReactNode);\n};\n\nexport type McpAppRendererOptions = McpAppPartOptions & {\n /**\n * Provides the data-plane operations the widget can request\n * (`loadResource`, `callTool`, `readResource`, `listResources`). Use\n * `McpAppsRemoteHost({ url })` for the default HTTP-route convention.\n */\n host: ResourceElement<McpAppsHost>;\n /**\n * Resolves the options for one part. Each returned value replaces the\n * thread-wide option of the same name, so a host can give every MCP app its\n * own display mode and answer `requestDisplayMode` for the part that asked.\n *\n * `handlers` is the exception and merges per key. Its keys are capabilities\n * negotiated with the widget rather than data, so replacing the whole bag to\n * add one handler would withdraw the others from that part's widget with\n * nothing to observe it by.\n */\n forPart?: (part: ToolCallMessagePart) => McpAppPartOptions;\n};\n\ntype LoadedResourceState = {\n host: McpAppsHost;\n resourceUri: string;\n serverId?: string;\n resource?: McpAppResource;\n error?: Error;\n};\n\ntype RendererState = {\n host: McpAppsHost;\n options: McpAppRendererOptions;\n};\n\ntype UseRendererStore = UseBoundStore<StoreApi<RendererState>>;\n\n// Callers pass options as an object literal, so the resource hands this a fresh\n// identity on every run; comparing the values keeps an unchanged run from\n// re-rendering every mounted part. `host` is excluded because it is an element\n// rebuilt on every run, and the store carries the resolved host separately.\nconst isSameOptions = (\n a: McpAppRendererOptions,\n b: McpAppRendererOptions,\n): boolean => {\n const aKeys = Object.keys(a).filter((key) => key !== \"host\");\n const bKeys = Object.keys(b).filter((key) => key !== \"host\");\n if (aKeys.length !== bKeys.length) return false;\n const aValues = a as Record<string, unknown>;\n const bValues = b as Record<string, unknown>;\n return aKeys.every(\n (key) =>\n Object.hasOwn(bValues, key) && Object.is(aValues[key], bValues[key]),\n );\n};\n\nfunction getInput(part: {\n status: { type: string };\n argsText: string;\n args: unknown;\n}): unknown {\n if (\n part.status.type === \"running\" &&\n (part.argsText === \"\" || part.argsText === \"{}\")\n ) {\n return undefined;\n }\n return part.args;\n}\n\nconst defaultOpenLink = ({ url }: { url: string }) => {\n window.open(url, \"_blank\", \"noopener,noreferrer\");\n};\n\nfunction extractSendMessageTexts(params: unknown): string[] | undefined {\n if (typeof params === \"string\") return [params];\n if (!params || typeof params !== \"object\") return undefined;\n const obj = params as Record<string, unknown>;\n if (typeof obj[\"prompt\"] === \"string\") return [obj[\"prompt\"]];\n if (typeof obj[\"text\"] === \"string\") return [obj[\"text\"]];\n if (typeof obj[\"message\"] === \"string\") return [obj[\"message\"]];\n const content = obj[\"content\"];\n if (Array.isArray(content)) {\n return Object.keys(content)\n .filter((key) => {\n const index = Number(key);\n return (\n Number.isInteger(index) &&\n index >= 0 &&\n index < content.length &&\n String(index) === key\n );\n })\n .map((key) => content[Number(key)])\n .filter(\n (block): block is { type: \"text\"; text: string } =>\n isRecord(block) &&\n block[\"type\"] === \"text\" &&\n typeof block[\"text\"] === \"string\",\n )\n .map((block) => block.text);\n }\n return undefined;\n}\n\nfunction extractSendMessageContent(\n params: unknown,\n): { content: TextMessagePart[] } | { reason: string } {\n const texts = extractSendMessageTexts(params);\n if (!texts) return { reason: \"unrecognised params shape\" };\n const content = texts\n .filter((text) => text !== \"\")\n .map((text): TextMessagePart => ({ type: \"text\", text }));\n if (content.length === 0) {\n return { reason: \"no text content to append\" };\n }\n return { content };\n}\n\nfunction resolvePartOptions(\n options: McpAppRendererOptions,\n part: ToolCallMessagePartProps,\n): McpAppRendererOptions {\n const overrides = options.forPart?.(part);\n if (!overrides) return options;\n const handlers =\n options.handlers && overrides.handlers\n ? { ...options.handlers, ...overrides.handlers }\n : (overrides.handlers ?? options.handlers);\n return {\n ...options,\n ...overrides,\n ...(handlers === undefined ? {} : { handlers }),\n };\n}\n\nfunction InlineRenderer({\n part,\n useRendererStore,\n}: {\n part: ToolCallMessagePartProps;\n useRendererStore: UseRendererStore;\n}) {\n const aui = useAui();\n const rendererOptions = useRendererStore((state) => state.options);\n const opts = resolvePartOptions(rendererOptions, part);\n const app = getMcpAppFromToolPart(part);\n const cachedAppRef = useRef<McpAppMetadata | undefined>(undefined);\n useIsomorphicLayoutEffect(() => {\n if (app != null) cachedAppRef.current = app;\n }, [app]);\n const appForRender = app ?? cachedAppRef.current;\n\n const [loadedResource, setLoadedResource] = useState<LoadedResourceState>();\n\n const host = useRendererStore((state) => state.host);\n const resourceUri = appForRender?.resourceUri;\n const serverId = appForRender?.serverId;\n const callerHandlers = opts.handlers;\n useEffect(() => {\n if (resourceUri == null) return;\n let cancelled = false;\n const targetHost = host;\n const targetUri = resourceUri;\n const targetServerId = serverId;\n\n // Host changes are published later in this passive flush. Defer until that\n // publication lands, then verify this effect still owns the current host.\n const loadResource = async () => {\n await Promise.resolve();\n if (cancelled || useRendererStore.getState().host !== targetHost) return;\n try {\n const res = await targetHost.loadResource({\n uri: targetUri,\n ...(targetServerId ? { serverId: targetServerId } : {}),\n });\n if (!cancelled)\n setLoadedResource({\n host: targetHost,\n resourceUri: targetUri,\n ...(targetServerId !== undefined\n ? { serverId: targetServerId }\n : {}),\n resource: res,\n });\n } catch (error: unknown) {\n if (!cancelled) {\n setLoadedResource({\n host: targetHost,\n resourceUri: targetUri,\n ...(targetServerId !== undefined\n ? { serverId: targetServerId }\n : {}),\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n };\n void loadResource();\n\n return () => {\n cancelled = true;\n };\n }, [host, resourceUri, serverId, useRendererStore]);\n\n const bridgeHandlers = useMemo<McpAppBridgeHandlers>(\n () => ({\n ...callerHandlers,\n openLink: callerHandlers?.openLink ?? defaultOpenLink,\n sendMessage:\n callerHandlers?.sendMessage ??\n ((params) => {\n const result = extractSendMessageContent(params);\n if (\"reason\" in result) {\n return { isError: true, ok: false, reason: result.reason };\n }\n const composer = aui.thread.composer();\n composer.setText(\n [\n composer.getState().text,\n result.content.map((part) => part.text).join(\"\\n\"),\n ]\n .filter((part) => part.trim())\n .join(\" \"),\n );\n return { ok: true };\n }),\n callTool: (params) =>\n useRendererStore.getState().host.callTool({\n ...params,\n ...(serverId ? { serverId } : {}),\n }),\n readResource: (params) =>\n useRendererStore.getState().host.readResource({\n ...params,\n ...(serverId ? { serverId } : {}),\n }),\n listResources: (params) => {\n if (!serverId) {\n return useRendererStore.getState().host.listResources(params);\n }\n return useRendererStore.getState().host.listResources({\n ...(isRecord(params) ? params : {}),\n serverId,\n });\n },\n }),\n [aui, callerHandlers, serverId, useRendererStore],\n );\n\n const loadedResourceForApp =\n loadedResource?.host === host &&\n loadedResource?.resourceUri === appForRender?.resourceUri &&\n loadedResource?.serverId === appForRender?.serverId\n ? loadedResource\n : undefined;\n const appResource = loadedResourceForApp?.resource;\n const error = loadedResourceForApp?.error;\n\n const fallback = opts.fallback ?? null;\n if (appForRender == null) {\n return <>{fallback}</>;\n }\n if (error != null) {\n const errorFallback = opts.errorFallback;\n if (errorFallback === undefined) return <>{fallback}</>;\n if (typeof errorFallback === \"function\") return <>{errorFallback(error)}</>;\n return <>{errorFallback}</>;\n }\n if (appResource == null) {\n return <>{opts.loadingFallback ?? fallback}</>;\n }\n\n return (\n <McpAppFrame\n app={appForRender}\n resource={appResource}\n input={getInput(part)}\n output={part.result}\n sandbox={opts.sandbox}\n handlers={bridgeHandlers}\n hostInfo={opts.hostInfo}\n hostContext={opts.hostContext}\n maxHeight={opts.maxHeight}\n />\n );\n}\n\n/**\n * Creates a tool-call renderer for MCP Apps embedded in assistant messages.\n *\n * Compose this into the `Tools` resource through its `mcpApp` option. When a\n * tool-call part carries `mcp.app` metadata for a `ui://` resource, the\n * renderer loads that resource from the configured host and displays it in a\n * sandboxed frame.\n */\nconst useMcpAppRenderer = (\n options: McpAppRendererOptions,\n): { readonly render: ToolCallMessagePartComponent } => {\n const host = useResource(options.host);\n\n // The rendered component identity has to stay stable, or every part remounts\n // its frame; options reach the parts through the store instead of props.\n const [useRendererStore] = useState(() =>\n create<RendererState>(() => ({ host, options })),\n );\n useEffect(() => {\n useRendererStore.setState((prev) =>\n prev.host === host && isSameOptions(prev.options, options)\n ? prev\n : { host, options },\n );\n }, [host, options, useRendererStore]);\n\n const render = useMemo((): ToolCallMessagePartComponent => {\n const Render: ToolCallMessagePartComponent = (props) => (\n <InlineRenderer part={props} useRendererStore={useRendererStore} />\n );\n Render.displayName = \"McpAppRenderer\";\n return Render;\n }, [useRendererStore]);\n\n return { render };\n};\n\nexport const McpAppRenderer = resource(useMcpAppRenderer);\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useEffect, useMemo, useRef } from "@assistant-ui/tap/react-shim";
|
|
2
2
|
import { resource } from "@assistant-ui/tap";
|
|
3
|
-
|
|
3
|
+
// src/mcp-apps/McpAppsRemoteHost.ts
|
|
4
4
|
const truncateBody = (body) => body.length > 500 ? `${body.slice(0, 500)}...` : body;
|
|
5
5
|
const extractErrorBody = (body) => {
|
|
6
6
|
const trimmed = body.trim();
|
|
@@ -97,7 +97,6 @@ const useMcpAppsRemoteHost = (options) => {
|
|
|
97
97
|
return hostState.host;
|
|
98
98
|
};
|
|
99
99
|
const McpAppsRemoteHost = resource(useMcpAppsRemoteHost);
|
|
100
|
-
//#endregion
|
|
101
100
|
export { McpAppsRemoteHost };
|
|
102
101
|
|
|
103
102
|
//# sourceMappingURL=McpAppsRemoteHost.js.map
|
|
@@ -7,7 +7,7 @@ import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
|
7
7
|
import { useEffect, useRef } from "@assistant-ui/tap/react-shim";
|
|
8
8
|
import { isRecord } from "@assistant-ui/core/internal";
|
|
9
9
|
import { jsx } from "react/jsx-runtime";
|
|
10
|
-
|
|
10
|
+
// src/mcp-apps/app-frame.tsx
|
|
11
11
|
const DEFAULT_PRODUCT = "assistant-ui-mcp-app";
|
|
12
12
|
const INIT_TIMEOUT_MS = 5e3;
|
|
13
13
|
const DEFAULT_MAX_HEIGHT = 800;
|
|
@@ -305,7 +305,6 @@ function _temp2(b_1, v_0) {
|
|
|
305
305
|
function _temp(b_0, v) {
|
|
306
306
|
return b_0.notifyToolInput(v);
|
|
307
307
|
}
|
|
308
|
-
//#endregion
|
|
309
308
|
export { McpAppFrame };
|
|
310
309
|
|
|
311
310
|
//# sourceMappingURL=app-frame.js.map
|
package/dist/mcp-apps/bridge.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import "./types.js";
|
|
2
2
|
import { invokeUserCallback, isRecord } from "@assistant-ui/core/internal";
|
|
3
|
-
|
|
3
|
+
// src/mcp-apps/bridge.ts
|
|
4
4
|
const VALID_DISPLAY_MODES = [
|
|
5
5
|
"inline",
|
|
6
6
|
"fullscreen",
|
|
@@ -314,7 +314,6 @@ function createMcpAppBridge(opts) {
|
|
|
314
314
|
}
|
|
315
315
|
};
|
|
316
316
|
}
|
|
317
|
-
//#endregion
|
|
318
317
|
export { createMcpAppBridge };
|
|
319
318
|
|
|
320
319
|
//# sourceMappingURL=bridge.js.map
|
package/dist/mcp-apps/csp.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
// src/mcp-apps/csp.ts
|
|
2
2
|
const isAllowedOrigin = (value, allowWebSocket) => {
|
|
3
3
|
if (!(allowWebSocket ? /^(?:https?|wss?):\/\//i : /^https?:\/\//i).test(value) || /[\s;'"`,]/.test(value)) return false;
|
|
4
4
|
try {
|
|
@@ -87,7 +87,6 @@ const applyMcpAppCsp = (html, csp) => {
|
|
|
87
87
|
const insertionPoint = findDoctypeEnd(normalizedHtml);
|
|
88
88
|
return `${normalizedHtml.slice(0, insertionPoint)}${meta}${normalizedHtml.slice(insertionPoint)}`;
|
|
89
89
|
};
|
|
90
|
-
//#endregion
|
|
91
90
|
export { applyMcpAppCsp, buildMcpAppCsp };
|
|
92
91
|
|
|
93
92
|
//# sourceMappingURL=csp.js.map
|
package/dist/mcp-apps/types.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
// src/mcp-apps/types.ts
|
|
2
2
|
const MCP_APP_MIME_TYPE = "text/html;profile=mcp-app";
|
|
3
3
|
const MCP_APP_PROTOCOL_VERSION = "0.1";
|
|
4
|
-
//#endregion
|
|
5
4
|
export { MCP_APP_MIME_TYPE, MCP_APP_PROTOCOL_VERSION };
|
|
6
5
|
|
|
7
6
|
//# sourceMappingURL=types.js.map
|
package/dist/mcp-apps/utils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isMcpAppUri } from "@assistant-ui/core";
|
|
2
|
-
|
|
2
|
+
// src/mcp-apps/utils.ts
|
|
3
3
|
/**
|
|
4
4
|
* Returns MCP app metadata for a tool-call part that points at a `ui://`
|
|
5
5
|
* resource.
|
|
@@ -13,7 +13,6 @@ function getMcpAppFromToolPart(part) {
|
|
|
13
13
|
if (!isMcpAppUri(app.resourceUri)) return void 0;
|
|
14
14
|
return app;
|
|
15
15
|
}
|
|
16
|
-
//#endregion
|
|
17
16
|
export { getMcpAppFromToolPart };
|
|
18
17
|
|
|
19
18
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { AssistantFrameHost } from "@assistant-ui/core";
|
|
3
3
|
import { useEffect } from "@assistant-ui/tap/react-shim";
|
|
4
|
-
|
|
4
|
+
// src/model-context/frame/useAssistantFrameHost.ts
|
|
5
5
|
/**
|
|
6
6
|
* React hook that manages the lifecycle of an AssistantFrameHost and its binding to the current AssistantRuntime.
|
|
7
7
|
*
|
|
@@ -91,7 +91,6 @@ const useAssistantFrameHost = ({ iframeRef, targetOrigin, register }) => {
|
|
|
91
91
|
register
|
|
92
92
|
]);
|
|
93
93
|
};
|
|
94
|
-
//#endregion
|
|
95
94
|
export { useAssistantFrameHost };
|
|
96
95
|
|
|
97
96
|
//# sourceMappingURL=useAssistantFrameHost.js.map
|
|
@@ -5,7 +5,7 @@ import { createContext, forwardRef, useContext, useEffect, useId, useRef } from
|
|
|
5
5
|
import { useAui } from "@assistant-ui/store";
|
|
6
6
|
import { jsx } from "react/jsx-runtime";
|
|
7
7
|
import { useComposedRefs } from "radix-ui/internal";
|
|
8
|
-
|
|
8
|
+
// src/model-context/makeAssistantVisible.tsx
|
|
9
9
|
const DEFAULT_ACTION_SETTLE_DELAY_MS = 2e3;
|
|
10
10
|
const MAX_ACTION_SETTLE_DELAY_MS = 2147483647;
|
|
11
11
|
const waitForSettle = async (settleDelayMs) => {
|
|
@@ -144,7 +144,6 @@ const makeAssistantVisible = (Component, config) => {
|
|
|
144
144
|
ReadableComponent.displayName = Component.displayName;
|
|
145
145
|
return ReadableComponent;
|
|
146
146
|
};
|
|
147
|
-
//#endregion
|
|
148
147
|
export { makeAssistantVisible as default, makeAssistantVisible };
|
|
149
148
|
|
|
150
149
|
//# sourceMappingURL=makeAssistantVisible.js.map
|
|
@@ -6,7 +6,7 @@ import { forwardRef } from "@assistant-ui/tap/react-shim";
|
|
|
6
6
|
import { useAuiState } from "@assistant-ui/store";
|
|
7
7
|
import { jsx } from "react/jsx-runtime";
|
|
8
8
|
import { composeEventHandlers } from "radix-ui/internal";
|
|
9
|
-
|
|
9
|
+
// src/primitives/actionBar/ActionBarCopy.tsx
|
|
10
10
|
/**
|
|
11
11
|
* Hook that provides copy functionality for action bar buttons.
|
|
12
12
|
*
|
|
@@ -144,7 +144,6 @@ function _temp(text) {
|
|
|
144
144
|
function _temp2(s) {
|
|
145
145
|
return s.message.isCopied;
|
|
146
146
|
}
|
|
147
|
-
//#endregion
|
|
148
147
|
export { ActionBarPrimitiveCopy };
|
|
149
148
|
|
|
150
149
|
//# sourceMappingURL=ActionBarCopy.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { createActionButton } from "../../utils/createActionButton.js";
|
|
3
3
|
import { useActionBarEdit } from "@assistant-ui/core/react";
|
|
4
|
-
|
|
4
|
+
// src/primitives/actionBar/ActionBarEdit.ts
|
|
5
5
|
/**
|
|
6
6
|
* Hook that provides edit functionality for action bar buttons.
|
|
7
7
|
*
|
|
@@ -42,7 +42,6 @@ const useActionBarEdit$1 = () => {
|
|
|
42
42
|
* ```
|
|
43
43
|
*/
|
|
44
44
|
const ActionBarPrimitiveEdit = createActionButton("ActionBarPrimitive.Edit", useActionBarEdit$1);
|
|
45
|
-
//#endregion
|
|
46
45
|
export { ActionBarPrimitiveEdit };
|
|
47
46
|
|
|
48
47
|
//# sourceMappingURL=ActionBarEdit.js.map
|
|
@@ -5,7 +5,7 @@ import { forwardRef } from "@assistant-ui/tap/react-shim";
|
|
|
5
5
|
import { useAui, useAuiState } from "@assistant-ui/store";
|
|
6
6
|
import { jsx } from "react/jsx-runtime";
|
|
7
7
|
import { composeEventHandlers } from "radix-ui/internal";
|
|
8
|
-
|
|
8
|
+
// src/primitives/actionBar/ActionBarExportMarkdown.tsx
|
|
9
9
|
const useActionBarExportMarkdown = (t0) => {
|
|
10
10
|
const $ = c(6);
|
|
11
11
|
let t1;
|
|
@@ -122,7 +122,6 @@ function _temp2(s) {
|
|
|
122
122
|
function _temp3(error) {
|
|
123
123
|
console.error("[assistant-ui] markdown export failed:", error);
|
|
124
124
|
}
|
|
125
|
-
//#endregion
|
|
126
125
|
export { ActionBarPrimitiveExportMarkdown };
|
|
127
126
|
|
|
128
127
|
//# sourceMappingURL=ActionBarExportMarkdown.js.map
|
|
@@ -6,7 +6,7 @@ import { forwardRef } from "@assistant-ui/tap/react-shim";
|
|
|
6
6
|
import { useAuiState } from "@assistant-ui/store";
|
|
7
7
|
import { jsx } from "react/jsx-runtime";
|
|
8
8
|
import { composeEventHandlers } from "radix-ui/internal";
|
|
9
|
-
|
|
9
|
+
// src/primitives/actionBar/ActionBarFeedbackNegative.tsx
|
|
10
10
|
const useActionBarFeedbackNegative$1 = () => {
|
|
11
11
|
const { submit } = useActionBarFeedbackNegative();
|
|
12
12
|
return submit;
|
|
@@ -76,7 +76,6 @@ ActionBarPrimitiveFeedbackNegative.displayName = "ActionBarPrimitive.FeedbackNeg
|
|
|
76
76
|
function _temp(s) {
|
|
77
77
|
return s.message.metadata.submittedFeedback?.type === "negative";
|
|
78
78
|
}
|
|
79
|
-
//#endregion
|
|
80
79
|
export { ActionBarPrimitiveFeedbackNegative };
|
|
81
80
|
|
|
82
81
|
//# sourceMappingURL=ActionBarFeedbackNegative.js.map
|