@iloveagents/foundry-web-ui 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +13 -4
  2. package/dist/components/ag-ui-runtime-provider.d.ts +64 -0
  3. package/dist/components/ag-ui-runtime-provider.js +71 -0
  4. package/dist/components/app-brand.d.ts +6 -0
  5. package/dist/components/app-brand.js +13 -0
  6. package/dist/components/assistant-chat.d.ts +26 -0
  7. package/dist/components/assistant-chat.js +93 -0
  8. package/dist/components/chat-attachments.d.ts +25 -0
  9. package/dist/components/chat-attachments.js +20 -0
  10. package/dist/components/chat-bubble.d.ts +1 -0
  11. package/dist/components/chat-bubble.js +103 -0
  12. package/dist/components/chat-header.d.ts +2 -0
  13. package/dist/components/chat-header.js +16 -0
  14. package/dist/components/client-tool-executor.d.ts +12 -0
  15. package/dist/components/client-tool-executor.js +108 -0
  16. package/dist/components/collection-empty-state.d.ts +9 -0
  17. package/dist/components/collection-empty-state.js +6 -0
  18. package/dist/components/collection-filter-bar.d.ts +19 -0
  19. package/dist/components/collection-filter-bar.js +28 -0
  20. package/dist/components/collection-search-input.d.ts +6 -0
  21. package/dist/components/collection-search-input.js +8 -0
  22. package/dist/components/collection-skeleton.d.ts +6 -0
  23. package/dist/components/collection-skeleton.js +10 -0
  24. package/dist/components/collection-sort-menu.d.ts +10 -0
  25. package/dist/components/collection-sort-menu.js +9 -0
  26. package/dist/components/collection-surface.d.ts +8 -0
  27. package/dist/components/collection-surface.js +5 -0
  28. package/dist/components/collection-toolbar.d.ts +9 -0
  29. package/dist/components/collection-toolbar.js +5 -0
  30. package/dist/components/collection-view-toggle.d.ts +7 -0
  31. package/dist/components/collection-view-toggle.js +17 -0
  32. package/dist/components/composer-submit-bridge.d.ts +1 -0
  33. package/dist/components/composer-submit-bridge.js +15 -0
  34. package/dist/components/confirm-dialog.d.ts +11 -0
  35. package/dist/components/confirm-dialog.js +6 -0
  36. package/dist/components/confirmation-card.d.ts +14 -0
  37. package/dist/components/confirmation-card.js +12 -0
  38. package/dist/components/context-badges.d.ts +16 -0
  39. package/dist/components/context-badges.js +56 -0
  40. package/dist/components/context-bar.d.ts +41 -0
  41. package/dist/components/context-bar.js +123 -0
  42. package/dist/components/form-dialog.d.ts +12 -0
  43. package/dist/components/form-dialog.js +13 -0
  44. package/dist/components/global-selection-popover.d.ts +7 -0
  45. package/dist/components/global-selection-popover.js +167 -0
  46. package/dist/components/infinite-scroll-sentinel.d.ts +6 -0
  47. package/dist/components/infinite-scroll-sentinel.js +25 -0
  48. package/dist/components/json-viewer.d.ts +10 -0
  49. package/dist/components/json-viewer.js +80 -0
  50. package/dist/components/loading-indicator.d.ts +4 -0
  51. package/dist/components/loading-indicator.js +22 -0
  52. package/dist/components/markdown-text.d.ts +13 -0
  53. package/dist/components/markdown-text.js +221 -0
  54. package/dist/components/name-dialog.d.ts +16 -0
  55. package/dist/components/name-dialog.js +23 -0
  56. package/dist/components/selection-popover.d.ts +12 -0
  57. package/dist/components/selection-popover.js +111 -0
  58. package/dist/components/show-document-tool-ui.d.ts +1 -0
  59. package/dist/components/show-document-tool-ui.js +53 -0
  60. package/dist/components/sidebar.d.ts +4 -0
  61. package/dist/components/sidebar.js +904 -0
  62. package/dist/components/surface-card.d.ts +9 -0
  63. package/dist/components/surface-card.js +33 -0
  64. package/dist/components/theme-runtime-provider.d.ts +15 -0
  65. package/dist/components/theme-runtime-provider.js +48 -0
  66. package/dist/components/theme-toggle.d.ts +2 -0
  67. package/dist/components/theme-toggle.js +19 -0
  68. package/dist/components/tool-call-card.d.ts +27 -0
  69. package/dist/components/tool-call-card.js +13 -0
  70. package/dist/components/tool-fallback.d.ts +26 -0
  71. package/dist/components/tool-fallback.js +129 -0
  72. package/dist/components/tool-panel-layout.d.ts +10 -0
  73. package/dist/components/tool-panel-layout.js +12 -0
  74. package/dist/components/tool-panel.d.ts +1 -0
  75. package/dist/components/tool-panel.js +89 -0
  76. package/dist/components/tooltip-icon-button.d.ts +7 -0
  77. package/dist/components/tooltip-icon-button.js +9 -0
  78. package/dist/components/user-menu.d.ts +2 -0
  79. package/dist/components/user-menu.js +14 -0
  80. package/dist/index.d.ts +68 -0
  81. package/dist/index.js +83 -0
  82. package/dist/lib/ag-ui-adapter.d.ts +29 -0
  83. package/dist/lib/ag-ui-adapter.js +373 -0
  84. package/dist/lib/app-store.d.ts +115 -0
  85. package/dist/lib/app-store.js +199 -0
  86. package/dist/lib/attachment-adapter.d.ts +20 -0
  87. package/dist/lib/attachment-adapter.js +99 -0
  88. package/dist/lib/auth-provider.d.ts +16 -0
  89. package/dist/lib/auth-provider.js +88 -0
  90. package/dist/lib/chat-bubble-store.d.ts +30 -0
  91. package/dist/lib/chat-bubble-store.js +23 -0
  92. package/dist/lib/chat-lifecycle-store.d.ts +10 -0
  93. package/{src/lib/chat-lifecycle-store.ts → dist/lib/chat-lifecycle-store.js} +3 -13
  94. package/dist/lib/client-tools.d.ts +11 -0
  95. package/dist/lib/client-tools.js +274 -0
  96. package/dist/lib/composer-submit-store.d.ts +12 -0
  97. package/dist/lib/composer-submit-store.js +17 -0
  98. package/dist/lib/dev-store.d.ts +38 -0
  99. package/dist/lib/dev-store.js +32 -0
  100. package/dist/lib/nav-config.d.ts +159 -0
  101. package/dist/lib/nav-config.js +162 -0
  102. package/dist/lib/nav-dnd.d.ts +8 -0
  103. package/dist/lib/nav-dnd.js +9 -0
  104. package/dist/lib/nav-store.d.ts +45 -0
  105. package/dist/lib/nav-store.js +49 -0
  106. package/dist/lib/selection-context.d.ts +21 -0
  107. package/dist/lib/selection-context.js +34 -0
  108. package/dist/lib/sidebar-store.d.ts +23 -0
  109. package/dist/lib/sidebar-store.js +98 -0
  110. package/dist/lib/theme-runtime.d.ts +130 -0
  111. package/dist/lib/theme-runtime.js +479 -0
  112. package/dist/lib/theme-store.d.ts +15 -0
  113. package/dist/lib/theme-store.js +53 -0
  114. package/dist/lib/tool-panel-store.d.ts +48 -0
  115. package/dist/lib/tool-panel-store.js +69 -0
  116. package/dist/lib/use-new-conversation.d.ts +8 -0
  117. package/dist/lib/use-new-conversation.js +62 -0
  118. package/dist/lib/use-page-tools.d.ts +27 -0
  119. package/{src/lib/use-page-tools.ts → dist/lib/use-page-tools.js} +11 -13
  120. package/dist/styles.css +142 -0
  121. package/dist/ui/collapsible.d.ts +5 -0
  122. package/{src/ui/collapsible.tsx → dist/ui/collapsible.js} +0 -2
  123. package/dist/ui/dialog.d.ts +15 -0
  124. package/dist/ui/dialog.js +25 -0
  125. package/dist/ui/dropdown-menu.d.ts +7 -0
  126. package/dist/ui/dropdown-menu.js +19 -0
  127. package/dist/ui/popover.d.ts +7 -0
  128. package/dist/ui/popover.js +10 -0
  129. package/dist/ui/select.d.ts +4 -0
  130. package/dist/ui/select.js +9 -0
  131. package/dist/ui/tooltip.d.ts +7 -0
  132. package/dist/ui/tooltip.js +10 -0
  133. package/package.json +31 -12
  134. package/AGENTS.md +0 -59
  135. package/CHANGELOG.md +0 -211
  136. package/CLAUDE.md +0 -1
  137. package/src/__tests__/no-spaces-imports.test.ts +0 -59
  138. package/src/__tests__/open-core-guards.test.ts +0 -307
  139. package/src/__tests__/theme-runtime.test.ts +0 -81
  140. package/src/__tests__/tool-fallback.test.tsx +0 -109
  141. package/src/components/__tests__/context-bar.test.ts +0 -112
  142. package/src/components/ag-ui-runtime-provider.tsx +0 -170
  143. package/src/components/app-brand.tsx +0 -38
  144. package/src/components/assistant-chat.tsx +0 -461
  145. package/src/components/chat-attachments.tsx +0 -68
  146. package/src/components/chat-bubble.tsx +0 -373
  147. package/src/components/chat-header.tsx +0 -44
  148. package/src/components/client-tool-executor.tsx +0 -230
  149. package/src/components/collection-empty-state.tsx +0 -37
  150. package/src/components/collection-filter-bar.tsx +0 -168
  151. package/src/components/collection-search-input.tsx +0 -41
  152. package/src/components/collection-skeleton.tsx +0 -55
  153. package/src/components/collection-sort-menu.tsx +0 -62
  154. package/src/components/collection-surface.tsx +0 -46
  155. package/src/components/collection-toolbar.tsx +0 -33
  156. package/src/components/collection-view-toggle.tsx +0 -61
  157. package/src/components/composer-submit-bridge.tsx +0 -19
  158. package/src/components/confirm-dialog.tsx +0 -49
  159. package/src/components/confirmation-card.tsx +0 -32
  160. package/src/components/context-badges.tsx +0 -136
  161. package/src/components/context-bar.tsx +0 -238
  162. package/src/components/form-dialog.tsx +0 -56
  163. package/src/components/global-selection-popover.tsx +0 -266
  164. package/src/components/infinite-scroll-sentinel.tsx +0 -48
  165. package/src/components/json-viewer.tsx +0 -232
  166. package/src/components/loading-indicator.tsx +0 -40
  167. package/src/components/markdown-text-citations.test.tsx +0 -108
  168. package/src/components/markdown-text.tsx +0 -508
  169. package/src/components/name-dialog.tsx +0 -87
  170. package/src/components/selection-popover.tsx +0 -156
  171. package/src/components/show-document-tool-ui.tsx +0 -90
  172. package/src/components/sidebar.test.tsx +0 -611
  173. package/src/components/sidebar.tsx +0 -1689
  174. package/src/components/surface-card.tsx +0 -45
  175. package/src/components/theme-runtime-provider.tsx +0 -93
  176. package/src/components/theme-toggle.tsx +0 -27
  177. package/src/components/tool-call-card.tsx +0 -126
  178. package/src/components/tool-fallback.tsx +0 -169
  179. package/src/components/tool-panel-layout.tsx +0 -36
  180. package/src/components/tool-panel.tsx +0 -233
  181. package/src/components/tooltip-icon-button.tsx +0 -28
  182. package/src/components/user-menu.tsx +0 -60
  183. package/src/index.ts +0 -185
  184. package/src/lib/__tests__/ag-ui-adapter.test.ts +0 -279
  185. package/src/lib/__tests__/app-store.test.ts +0 -405
  186. package/src/lib/__tests__/attachment-adapter.test.ts +0 -48
  187. package/src/lib/__tests__/chat-bubble-store.test.ts +0 -67
  188. package/src/lib/__tests__/client-tools.test.ts +0 -124
  189. package/src/lib/__tests__/dev-store.test.ts +0 -78
  190. package/src/lib/__tests__/nav-config.test.ts +0 -135
  191. package/src/lib/__tests__/nav-dnd.test.ts +0 -24
  192. package/src/lib/__tests__/nav-store.test.ts +0 -59
  193. package/src/lib/__tests__/selection-context.test.ts +0 -114
  194. package/src/lib/__tests__/sidebar-store.test.ts +0 -144
  195. package/src/lib/__tests__/theme-store.test.ts +0 -83
  196. package/src/lib/__tests__/tool-panel-store.test.ts +0 -61
  197. package/src/lib/__tests__/use-page-context.test.ts +0 -58
  198. package/src/lib/ag-ui-adapter.ts +0 -426
  199. package/src/lib/app-store.ts +0 -361
  200. package/src/lib/attachment-adapter.ts +0 -92
  201. package/src/lib/auth-provider.tsx +0 -144
  202. package/src/lib/chat-bubble-store.ts +0 -46
  203. package/src/lib/client-tools.ts +0 -293
  204. package/src/lib/composer-submit-store.ts +0 -32
  205. package/src/lib/dev-store.ts +0 -69
  206. package/src/lib/nav-config.ts +0 -329
  207. package/src/lib/nav-dnd.ts +0 -14
  208. package/src/lib/nav-store.ts +0 -89
  209. package/src/lib/selection-context.ts +0 -65
  210. package/src/lib/sidebar-store.ts +0 -113
  211. package/src/lib/theme-runtime.ts +0 -660
  212. package/src/lib/theme-store.ts +0 -67
  213. package/src/lib/tool-panel-store.ts +0 -121
  214. package/src/lib/use-new-conversation.test.tsx +0 -168
  215. package/src/lib/use-new-conversation.ts +0 -64
  216. package/src/ui/dialog.tsx +0 -109
  217. package/src/ui/dropdown-menu.tsx +0 -75
  218. package/src/ui/popover.tsx +0 -34
  219. package/src/ui/select.tsx +0 -15
  220. package/src/ui/tooltip.tsx +0 -30
  221. package/src/vite-env.d.ts +0 -1
  222. package/tsconfig.json +0 -16
  223. package/vitest.config.ts +0 -8
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Floating "Add to chat" button for text selection in the tool panel.
3
+ *
4
+ * Appears near the selected text when the user makes a selection within
5
+ * the panel content area. Clicking adds the selection to the context store.
6
+ */
7
+ import { type RefObject } from "react";
8
+ interface SelectionPopoverProps {
9
+ containerRef: RefObject<HTMLDivElement | null>;
10
+ }
11
+ export declare function SelectionPopover({ containerRef }: SelectionPopoverProps): import("react/jsx-runtime").JSX.Element | null;
12
+ export {};
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Floating "Add to chat" button for text selection in the tool panel.
4
+ *
5
+ * Appears near the selected text when the user makes a selection within
6
+ * the panel content area. Clicking adds the selection to the context store.
7
+ */
8
+ import { useState, useEffect, useCallback, useRef } from "react";
9
+ import { TextSelect } from "lucide-react";
10
+ import { cn } from "@iloveagents/foundry-web-primitives";
11
+ import { useAppStore } from "../lib/app-store.js";
12
+ import { useToolPanelStore } from "../lib/tool-panel-store.js";
13
+ const POPOVER_HEIGHT = 36;
14
+ const POPOVER_WIDTH = 126;
15
+ const OFFSET = 8;
16
+ export function SelectionPopover({ containerRef }) {
17
+ const [position, setPosition] = useState(null);
18
+ const [selectedText, setSelectedText] = useState("");
19
+ const addContextItem = useAppStore((s) => s.addContextItem);
20
+ const buttonRef = useRef(null);
21
+ const hidePopover = useCallback(() => {
22
+ setPosition(null);
23
+ setSelectedText("");
24
+ }, []);
25
+ const handleMouseUp = useCallback(() => {
26
+ // Small delay to let the selection finalize
27
+ requestAnimationFrame(() => {
28
+ const selection = window.getSelection();
29
+ if (!selection || selection.isCollapsed || !selection.toString().trim()) {
30
+ return;
31
+ }
32
+ // Ensure selection is within the container
33
+ const container = containerRef.current;
34
+ if (!container)
35
+ return;
36
+ const anchorNode = selection.anchorNode;
37
+ if (!anchorNode || !container.contains(anchorNode)) {
38
+ return;
39
+ }
40
+ const text = selection.toString().trim();
41
+ if (!text)
42
+ return;
43
+ const range = selection.getRangeAt(0);
44
+ const rect = range.getBoundingClientRect();
45
+ // The tool panel uses CSS transforms (translate-x), which creates
46
+ // a new containing block -- `position: fixed` becomes relative to
47
+ // the nearest transformed ancestor, not the viewport. Convert
48
+ // viewport coords to container-relative coords.
49
+ const containerRect = container.getBoundingClientRect();
50
+ // Position above selection
51
+ let top = rect.top - containerRect.top + container.scrollTop - POPOVER_HEIGHT - OFFSET;
52
+ let left = rect.left - containerRect.left + rect.width / 2 - POPOVER_WIDTH / 2;
53
+ // If would go above visible area, place below instead
54
+ if (rect.top - containerRect.top - POPOVER_HEIGHT - OFFSET < 0) {
55
+ top = rect.bottom - containerRect.top + container.scrollTop + OFFSET;
56
+ }
57
+ // Clamp horizontal within container
58
+ const maxLeft = containerRect.width - POPOVER_WIDTH - OFFSET;
59
+ left = Math.max(OFFSET, Math.min(left, maxLeft));
60
+ setSelectedText(text);
61
+ setPosition({ top, left });
62
+ });
63
+ }, [containerRef]);
64
+ const handleAddToContext = useCallback(() => {
65
+ if (!selectedText)
66
+ return;
67
+ const source = useToolPanelStore.getState().content?.title ?? "Document";
68
+ addContextItem({
69
+ type: "selection",
70
+ label: selectedText,
71
+ payload: { kind: "text", text: selectedText },
72
+ sourcePage: source,
73
+ persistence: "ephemeral",
74
+ });
75
+ // Clear selection and hide popover
76
+ window.getSelection()?.removeAllRanges();
77
+ hidePopover();
78
+ }, [selectedText, addContextItem, hidePopover]);
79
+ useEffect(() => {
80
+ const container = containerRef.current;
81
+ if (!container)
82
+ return;
83
+ container.addEventListener("mouseup", handleMouseUp);
84
+ // Hide on mousedown (new selection starting), scroll, or Escape.
85
+ // Skip if the mousedown is on the popover button itself -- React's
86
+ // synthetic onMouseDown fires after native listeners, so we can't
87
+ // rely on stopPropagation there.
88
+ const handleMouseDown = (e) => {
89
+ if (buttonRef.current?.contains(e.target))
90
+ return;
91
+ hidePopover();
92
+ };
93
+ const handleScroll = () => hidePopover();
94
+ const handleKeyDown = (e) => {
95
+ if (e.key === "Escape")
96
+ hidePopover();
97
+ };
98
+ container.addEventListener("mousedown", handleMouseDown);
99
+ container.addEventListener("scroll", handleScroll, true);
100
+ window.addEventListener("keydown", handleKeyDown);
101
+ return () => {
102
+ container.removeEventListener("mouseup", handleMouseUp);
103
+ container.removeEventListener("mousedown", handleMouseDown);
104
+ container.removeEventListener("scroll", handleScroll, true);
105
+ window.removeEventListener("keydown", handleKeyDown);
106
+ };
107
+ }, [containerRef, handleMouseUp, hidePopover]);
108
+ if (!position)
109
+ return null;
110
+ return (_jsxs("button", { ref: buttonRef, type: "button", className: cn("absolute z-50", "flex items-center gap-1.5", "rounded-lg border border-border bg-background shadow-lg", "px-3 py-1.5 text-xs font-medium text-foreground", "hover:bg-muted transition-colors", "animate-in fade-in-0 zoom-in-95 duration-150"), style: { top: position.top, left: position.left }, onMouseDown: (e) => e.preventDefault(), onClick: handleAddToContext, children: [_jsx(TextSelect, { className: "size-3.5 text-primary" }), "Add to chat"] }));
111
+ }
@@ -0,0 +1 @@
1
+ export declare const ShowDocumentToolUI: import("@assistant-ui/react").AssistantToolUI;
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { makeAssistantToolUI } from "@assistant-ui/react";
3
+ import { useRef } from "react";
4
+ import { FileText } from "lucide-react";
5
+ import { useToolPanelStore } from "../lib/tool-panel-store.js";
6
+ import { ToolCallCard } from "./tool-call-card.js";
7
+ export const ShowDocumentToolUI = makeAssistantToolUI({
8
+ toolName: "show_document",
9
+ render: ({ args, result, status, toolCallId }) => {
10
+ const openPanel = useToolPanelStore((state) => state.openPanel);
11
+ const openedToolCallsRef = useRef(new Set());
12
+ if (status.type === "complete" &&
13
+ result?.status === "success" &&
14
+ args &&
15
+ !openedToolCallsRef.current.has(toolCallId)) {
16
+ openedToolCallsRef.current.add(toolCallId);
17
+ queueMicrotask(() => {
18
+ openPanel({
19
+ title: args.title,
20
+ content: args.content,
21
+ type: args.type || "markdown",
22
+ });
23
+ });
24
+ }
25
+ let description = "";
26
+ if (status.type === "running") {
27
+ description = "Opening document...";
28
+ }
29
+ else if (status.type === "complete" && result) {
30
+ description =
31
+ result.message ||
32
+ (result.status === "success" ? "Document ready" : "Failed to open document");
33
+ }
34
+ else if (status.type === "requires-action") {
35
+ description = "Action required to display document";
36
+ }
37
+ const handleViewDocument = () => {
38
+ if (args) {
39
+ openPanel({
40
+ title: args.title,
41
+ content: args.content,
42
+ type: args.type || "markdown",
43
+ });
44
+ }
45
+ };
46
+ return (_jsx(ToolCallCard, { icon: _jsx(FileText, { className: "size-3.5" }), title: "Document Display", description: description, status: status, className: "w-full", action: status.type === "complete" && result?.status === "success" && args
47
+ ? {
48
+ label: "View Document",
49
+ onClick: handleViewDocument,
50
+ }
51
+ : undefined, children: args && (_jsxs("div", { className: "text-muted-foreground text-xs", children: [_jsx("span", { className: "font-medium", children: "Title:" }), " ", args.title, args.type && (_jsxs("span", { className: "ml-2", children: [_jsx("span", { className: "font-medium", children: "Type:" }), " ", args.type] }))] })) }));
52
+ },
53
+ });
@@ -0,0 +1,4 @@
1
+ declare function scrollNavRowIntoView(nav: HTMLElement, row: HTMLElement): void;
2
+ export declare const _scrollNavRowIntoViewForTest: typeof scrollNavRowIntoView;
3
+ export declare function Sidebar(): import("react/jsx-runtime").JSX.Element;
4
+ export {};