@cellarnode/ui 0.202.0 → 0.206.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -9
- package/dist/agent/activity-ledger.d.ts.map +1 -1
- package/dist/agent/activity-ledger.js +1 -1
- package/dist/agent/activity-ledger.js.map +1 -1
- package/dist/agent/composer.d.ts +64 -2
- package/dist/agent/composer.d.ts.map +1 -1
- package/dist/agent/composer.js +247 -9
- package/dist/agent/composer.js.map +1 -1
- package/dist/agent/confirm-card.d.ts.map +1 -1
- package/dist/agent/confirm-card.js +1 -1
- package/dist/agent/confirm-card.js.map +1 -1
- package/dist/agent/context.d.ts +94 -0
- package/dist/agent/context.d.ts.map +1 -0
- package/dist/agent/context.js +92 -0
- package/dist/agent/context.js.map +1 -0
- package/dist/agent/conversation.d.ts +41 -1
- package/dist/agent/conversation.d.ts.map +1 -1
- package/dist/agent/conversation.js +91 -6
- package/dist/agent/conversation.js.map +1 -1
- package/dist/agent/dropzone.d.ts +155 -0
- package/dist/agent/dropzone.d.ts.map +1 -0
- package/dist/agent/dropzone.js +404 -0
- package/dist/agent/dropzone.js.map +1 -0
- package/dist/agent/fixtures.d.ts.map +1 -1
- package/dist/agent/fixtures.js +6 -0
- package/dist/agent/fixtures.js.map +1 -1
- package/dist/agent/index.d.ts +12 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/markdown.d.ts.map +1 -1
- package/dist/agent/markdown.js +127 -9
- package/dist/agent/markdown.js.map +1 -1
- package/dist/agent/mentions.d.ts +75 -0
- package/dist/agent/mentions.d.ts.map +1 -0
- package/dist/agent/mentions.js +184 -0
- package/dist/agent/mentions.js.map +1 -0
- package/dist/agent/message.d.ts +16 -1
- package/dist/agent/message.d.ts.map +1 -1
- package/dist/agent/message.js +26 -6
- package/dist/agent/message.js.map +1 -1
- package/dist/agent/quote-reply.d.ts +40 -0
- package/dist/agent/quote-reply.d.ts.map +1 -0
- package/dist/agent/quote-reply.js +97 -0
- package/dist/agent/quote-reply.js.map +1 -0
- package/dist/agent/role-cards/brand-profile-card.d.ts +60 -0
- package/dist/agent/role-cards/brand-profile-card.d.ts.map +1 -0
- package/dist/agent/role-cards/brand-profile-card.js +113 -0
- package/dist/agent/role-cards/brand-profile-card.js.map +1 -0
- package/dist/agent/role-cards/card-text.d.ts +10 -0
- package/dist/agent/role-cards/card-text.d.ts.map +1 -0
- package/dist/agent/role-cards/card-text.js +38 -0
- package/dist/agent/role-cards/card-text.js.map +1 -0
- package/dist/agent/role-cards/fixtures.d.ts +29 -1
- package/dist/agent/role-cards/fixtures.d.ts.map +1 -1
- package/dist/agent/role-cards/fixtures.js +210 -1
- package/dist/agent/role-cards/fixtures.js.map +1 -1
- package/dist/agent/role-cards/host-contract.d.ts +34 -4
- package/dist/agent/role-cards/host-contract.d.ts.map +1 -1
- package/dist/agent/role-cards/host-contract.js +87 -1
- package/dist/agent/role-cards/host-contract.js.map +1 -1
- package/dist/agent/role-cards/inspector-view.d.ts.map +1 -1
- package/dist/agent/role-cards/inspector-view.js +12 -0
- package/dist/agent/role-cards/inspector-view.js.map +1 -1
- package/dist/agent/role-cards/lab-report-card.d.ts +40 -0
- package/dist/agent/role-cards/lab-report-card.d.ts.map +1 -0
- package/dist/agent/role-cards/lab-report-card.js +58 -0
- package/dist/agent/role-cards/lab-report-card.js.map +1 -0
- package/dist/agent/role-cards/label-card.d.ts +42 -0
- package/dist/agent/role-cards/label-card.d.ts.map +1 -0
- package/dist/agent/role-cards/label-card.js +65 -0
- package/dist/agent/role-cards/label-card.js.map +1 -0
- package/dist/agent/role-cards/org-card.d.ts +20 -0
- package/dist/agent/role-cards/org-card.d.ts.map +1 -0
- package/dist/agent/role-cards/org-card.js +37 -0
- package/dist/agent/role-cards/org-card.js.map +1 -0
- package/dist/agent/role-cards/registry.d.ts +13 -1
- package/dist/agent/role-cards/registry.d.ts.map +1 -1
- package/dist/agent/role-cards/registry.js +33 -0
- package/dist/agent/role-cards/registry.js.map +1 -1
- package/dist/agent/role-cards/schedule-card.d.ts +30 -0
- package/dist/agent/role-cards/schedule-card.d.ts.map +1 -0
- package/dist/agent/role-cards/schedule-card.js +58 -0
- package/dist/agent/role-cards/schedule-card.js.map +1 -0
- package/dist/agent/role-cards/stats-card.d.ts +30 -0
- package/dist/agent/role-cards/stats-card.d.ts.map +1 -0
- package/dist/agent/role-cards/stats-card.js +31 -0
- package/dist/agent/role-cards/stats-card.js.map +1 -0
- package/dist/agent/role-cards/text-safety.d.ts +3 -0
- package/dist/agent/role-cards/text-safety.d.ts.map +1 -1
- package/dist/agent/role-cards/text-safety.js +16 -0
- package/dist/agent/role-cards/text-safety.js.map +1 -1
- package/dist/agent/schema.d.ts +21 -0
- package/dist/agent/schema.d.ts.map +1 -1
- package/dist/agent/schema.js +22 -1
- package/dist/agent/schema.js.map +1 -1
- package/dist/agent/suggestions.d.ts +66 -0
- package/dist/agent/suggestions.d.ts.map +1 -0
- package/dist/agent/suggestions.js +186 -0
- package/dist/agent/suggestions.js.map +1 -0
- package/dist/agent/text-clean.d.ts +12 -0
- package/dist/agent/text-clean.d.ts.map +1 -0
- package/dist/agent/text-clean.js +55 -0
- package/dist/agent/text-clean.js.map +1 -0
- package/dist/agent/thread-list.d.ts +16 -4
- package/dist/agent/thread-list.d.ts.map +1 -1
- package/dist/agent/thread-list.js +43 -26
- package/dist/agent/thread-list.js.map +1 -1
- package/dist/agent/thread-title.d.ts +46 -0
- package/dist/agent/thread-title.d.ts.map +1 -0
- package/dist/agent/thread-title.js +99 -0
- package/dist/agent/thread-title.js.map +1 -0
- package/dist/agent/tool-activity-model.d.ts +4 -0
- package/dist/agent/tool-activity-model.d.ts.map +1 -1
- package/dist/agent/tool-activity-model.js +7 -0
- package/dist/agent/tool-activity-model.js.map +1 -1
- package/dist/agent/tool-activity.d.ts +6 -0
- package/dist/agent/tool-activity.d.ts.map +1 -1
- package/dist/agent/tool-activity.js +51 -9
- package/dist/agent/tool-activity.js.map +1 -1
- package/dist/agent/tool-call-card.d.ts +2 -0
- package/dist/agent/tool-call-card.d.ts.map +1 -1
- package/dist/agent/tool-call-card.js +13 -3
- package/dist/agent/tool-call-card.js.map +1 -1
- package/dist/agent/ui.d.ts +7 -0
- package/dist/agent/ui.d.ts.map +1 -1
- package/dist/agent/ui.js +7 -0
- package/dist/agent/ui.js.map +1 -1
- package/dist/animated-icons/download-icon.d.ts.map +1 -1
- package/dist/animated-icons/download-icon.js +6 -1
- package/dist/animated-icons/download-icon.js.map +1 -1
- package/dist/animated-icons/filter-icon.d.ts.map +1 -1
- package/dist/animated-icons/filter-icon.js +6 -1
- package/dist/animated-icons/filter-icon.js.map +1 -1
- package/dist/animated-icons/upload-icon.d.ts.map +1 -1
- package/dist/animated-icons/upload-icon.js +6 -1
- package/dist/animated-icons/upload-icon.js.map +1 -1
- package/dist/brand/brand-image-source-picker.d.ts.map +1 -1
- package/dist/brand/brand-image-source-picker.js +9 -6
- package/dist/brand/brand-image-source-picker.js.map +1 -1
- package/dist/brand/brand-profile-form-values.d.ts +2 -2
- package/dist/chat/chat-surface.d.ts +16 -1
- package/dist/chat/chat-surface.d.ts.map +1 -1
- package/dist/chat/chat-surface.js +18 -16
- package/dist/chat/chat-surface.js.map +1 -1
- package/dist/chat/chat-toggle-button.d.ts.map +1 -1
- package/dist/chat/chat-toggle-button.js +11 -5
- package/dist/chat/chat-toggle-button.js.map +1 -1
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.d.ts.map +1 -1
- package/dist/chat/index.js.map +1 -1
- package/dist/components/bottle-extract-dialog.js +1 -1
- package/dist/components/bottle-extract-dialog.js.map +1 -1
- package/dist/components/branch-overview-panel.d.ts.map +1 -1
- package/dist/components/branch-overview-panel.js +8 -4
- package/dist/components/branch-overview-panel.js.map +1 -1
- package/dist/components/branch-resolution-modal.js +1 -1
- package/dist/components/branch-resolution-modal.js.map +1 -1
- package/dist/components/card-stack.d.ts.map +1 -1
- package/dist/components/card-stack.js +9 -1
- package/dist/components/card-stack.js.map +1 -1
- package/dist/components/copy-button.d.ts.map +1 -1
- package/dist/components/copy-button.js +15 -4
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/listbox.d.ts.map +1 -1
- package/dist/components/listbox.js +5 -1
- package/dist/components/listbox.js.map +1 -1
- package/dist/components/metric-card.d.ts +1 -1
- package/dist/components/metric-card.d.ts.map +1 -1
- package/dist/components/metric-card.js +2 -2
- package/dist/components/metric-card.js.map +1 -1
- package/dist/components/shadcn-button.d.ts +1 -1
- package/dist/components/sidebar/sidebar-menu.d.ts +1 -1
- package/dist/components/toast.d.ts.map +1 -1
- package/dist/components/toast.js +1 -1
- package/dist/components/toast.js.map +1 -1
- package/dist/discovery/command-palette-trigger.d.ts.map +1 -1
- package/dist/discovery/command-palette-trigger.js +2 -2
- package/dist/discovery/command-palette-trigger.js.map +1 -1
- package/dist/globe/globe-scene-camera.d.ts.map +1 -1
- package/dist/globe/globe-scene-camera.js +5 -2
- package/dist/globe/globe-scene-camera.js.map +1 -1
- package/dist/lab-reports/upload-lab-report-dialog.d.ts.map +1 -1
- package/dist/lab-reports/upload-lab-report-dialog.js +3 -3
- package/dist/lab-reports/upload-lab-report-dialog.js.map +1 -1
- package/dist/mcp-connect/clients.d.ts +4 -2
- package/dist/mcp-connect/clients.d.ts.map +1 -1
- package/dist/mcp-connect/clients.js +5 -3
- package/dist/mcp-connect/clients.js.map +1 -1
- package/dist/mcp-connect/mcp-connect-panel.js +1 -1
- package/dist/mcp-connect/mcp-connect-panel.js.map +1 -1
- package/dist/nav/app-sidebar.d.ts +5 -0
- package/dist/nav/app-sidebar.d.ts.map +1 -1
- package/dist/nav/app-sidebar.js +5 -3
- package/dist/nav/app-sidebar.js.map +1 -1
- package/dist/nav/sidebar-footer.d.ts +3 -1
- package/dist/nav/sidebar-footer.d.ts.map +1 -1
- package/dist/nav/sidebar-footer.js +5 -3
- package/dist/nav/sidebar-footer.js.map +1 -1
- package/dist/notifications/index.d.ts +1 -1
- package/dist/notifications/index.d.ts.map +1 -1
- package/dist/notifications/index.js +1 -1
- package/dist/notifications/index.js.map +1 -1
- package/dist/notifications/notification-badge.d.ts +2 -0
- package/dist/notifications/notification-badge.d.ts.map +1 -1
- package/dist/notifications/notification-badge.js +9 -2
- package/dist/notifications/notification-badge.js.map +1 -1
- package/dist/notifications/notification-tray.d.ts.map +1 -1
- package/dist/notifications/notification-tray.js +12 -2
- package/dist/notifications/notification-tray.js.map +1 -1
- package/dist/offer/negotiation-labels.d.ts +5 -1
- package/dist/offer/negotiation-labels.d.ts.map +1 -1
- package/dist/offer/negotiation-labels.js +1 -1
- package/dist/offer/negotiation-labels.js.map +1 -1
- package/dist/offer/new-activity-pill.js +1 -1
- package/dist/offer/new-activity-pill.js.map +1 -1
- package/dist/opportunities/index.d.ts +1 -1
- package/dist/opportunities/index.d.ts.map +1 -1
- package/dist/opportunities/index.js.map +1 -1
- package/dist/opportunities/opportunity-add-to-journey-button.d.ts.map +1 -1
- package/dist/opportunities/opportunity-add-to-journey-button.js +17 -3
- package/dist/opportunities/opportunity-add-to-journey-button.js.map +1 -1
- package/dist/opportunities/opportunity-filter-bar.d.ts.map +1 -1
- package/dist/opportunities/opportunity-filter-bar.js +7 -1
- package/dist/opportunities/opportunity-filter-bar.js.map +1 -1
- package/dist/opportunities/wizard/wizard-stepper.d.ts +15 -0
- package/dist/opportunities/wizard/wizard-stepper.d.ts.map +1 -1
- package/dist/opportunities/wizard/wizard-stepper.js +17 -8
- package/dist/opportunities/wizard/wizard-stepper.js.map +1 -1
- package/dist/org/invite-member-dialog.d.ts.map +1 -1
- package/dist/org/invite-member-dialog.js +12 -1
- package/dist/org/invite-member-dialog.js.map +1 -1
- package/dist/portfolio/version-rail.d.ts.map +1 -1
- package/dist/portfolio/version-rail.js +1 -1
- package/dist/portfolio/version-rail.js.map +1 -1
- package/dist/portfolio-import/import-job-detail-view.d.ts.map +1 -1
- package/dist/portfolio-import/import-job-detail-view.js +12 -1
- package/dist/portfolio-import/import-job-detail-view.js.map +1 -1
- package/dist/portfolio-import/import-job-panels.d.ts.map +1 -1
- package/dist/portfolio-import/import-job-panels.js +13 -2
- package/dist/portfolio-import/import-job-panels.js.map +1 -1
- package/dist/portfolio-import/import-products-dialog.d.ts.map +1 -1
- package/dist/portfolio-import/import-products-dialog.js +5 -2
- package/dist/portfolio-import/import-products-dialog.js.map +1 -1
- package/dist/profile/api-keys/backend-as-metadata.fixture.d.ts +9 -0
- package/dist/profile/api-keys/backend-as-metadata.fixture.d.ts.map +1 -0
- package/dist/profile/api-keys/backend-as-metadata.fixture.js +42 -0
- package/dist/profile/api-keys/backend-as-metadata.fixture.js.map +1 -0
- package/dist/profile/api-keys/connected-apps-card.d.ts +2 -2
- package/dist/profile/api-keys/connected-apps-card.d.ts.map +1 -1
- package/dist/profile/api-keys/connected-apps-card.js +7 -3
- package/dist/profile/api-keys/connected-apps-card.js.map +1 -1
- package/dist/profile/api-keys/create-api-key-dialog.js +2 -2
- package/dist/profile/api-keys/create-api-key-dialog.js.map +1 -1
- package/dist/profile/api-keys/index.d.ts +2 -1
- package/dist/profile/api-keys/index.d.ts.map +1 -1
- package/dist/profile/api-keys/index.js +2 -1
- package/dist/profile/api-keys/index.js.map +1 -1
- package/dist/profile/api-keys/oauth-scopes.d.ts +8 -0
- package/dist/profile/api-keys/oauth-scopes.d.ts.map +1 -0
- package/dist/profile/api-keys/oauth-scopes.js +41 -0
- package/dist/profile/api-keys/oauth-scopes.js.map +1 -0
- package/dist/profile/api-keys/profile-keys-section.d.ts +6 -1
- package/dist/profile/api-keys/profile-keys-section.d.ts.map +1 -1
- package/dist/profile/api-keys/profile-keys-section.js +17 -2
- package/dist/profile/api-keys/profile-keys-section.js.map +1 -1
- package/dist/profile/api-keys/scope-list.d.ts +6 -1
- package/dist/profile/api-keys/scope-list.d.ts.map +1 -1
- package/dist/profile/api-keys/scope-list.js +10 -3
- package/dist/profile/api-keys/scope-list.js.map +1 -1
- package/dist/profile/api-keys/types.d.ts +14 -0
- package/dist/profile/api-keys/types.d.ts.map +1 -1
- package/dist/profile/api-keys/types.js +21 -0
- package/dist/profile/api-keys/types.js.map +1 -1
- package/dist/realtime/organisation-events/schemas.d.ts +2 -2
- package/package.json +7 -2
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useId, useLayoutEffect, useMemo, useRef, useState, } from "react";
|
|
3
|
+
import { CornerDownRight } from "lucide-react";
|
|
4
|
+
import { cn } from "../lib/utils.js";
|
|
5
|
+
import { useCopy } from "./copy.js";
|
|
6
|
+
import { cleanLine, cleanPromptText } from "./text-clean.js";
|
|
7
|
+
import { agentButton, agentChip, focusRing } from "./ui.js";
|
|
8
|
+
/** The most suggested actions the row draws, and the most follow-ups the palette draws. A host cannot make either longer. */
|
|
9
|
+
export const MAX_SUGGESTED_ACTIONS = 8;
|
|
10
|
+
export const MAX_FOLLOW_UPS = 5;
|
|
11
|
+
export const MAX_SUGGESTION_LABEL = 100;
|
|
12
|
+
export const MAX_SUGGESTION_PROMPT = 500;
|
|
13
|
+
// Text for the composer, cleaned by the shared rule (`text-clean.ts`): invisible and direction characters out, ZWJ, ZWNJ, VS15 and
|
|
14
|
+
// VS16 kept, line breaks, carriage returns and tabs kept. The labels use the same rule, so a label and its prompt agree.
|
|
15
|
+
const cleanPrompt = (t) => cleanPromptText(t, MAX_SUGGESTION_PROMPT);
|
|
16
|
+
/**
|
|
17
|
+
* What a chosen suggestion puts in the composer: its `prompt` (else its label), with direction overrides and invisible characters
|
|
18
|
+
* removed, trimmed, and cut. Host and model text is untrusted: it is the person who reads this and decides to send it.
|
|
19
|
+
*/
|
|
20
|
+
export const suggestionPrompt = (s) => cleanPrompt(s.prompt) || cleanPrompt(s.label);
|
|
21
|
+
/** The suggestions the ui will draw: labels cleaned and cut (an item with nothing readable left is skipped), then capped. */
|
|
22
|
+
export function sanitizeSuggestions(list, max) {
|
|
23
|
+
const out = [];
|
|
24
|
+
for (const s of list ?? []) {
|
|
25
|
+
if (out.length >= max)
|
|
26
|
+
break;
|
|
27
|
+
const label = cleanLine(s?.label, MAX_SUGGESTION_LABEL, true);
|
|
28
|
+
if (!label)
|
|
29
|
+
continue;
|
|
30
|
+
// Only the DISPLAY label is clipped: the prompt falls back to the whole (cleaned, 500-capped) label, never "first 100 characters...".
|
|
31
|
+
const fullLabel = cleanPrompt(s.label);
|
|
32
|
+
// (a prompt that is empty or invisible-only after cleaning counts as absent)
|
|
33
|
+
out.push(!cleanPrompt(s.prompt) && fullLabel !== label
|
|
34
|
+
? { ...s, label, prompt: fullLabel }
|
|
35
|
+
: { ...s, label });
|
|
36
|
+
}
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
const ROW_COPY = { label: "Suggested actions" };
|
|
40
|
+
/**
|
|
41
|
+
* @internal A single, horizontally scrolling row of host-provided suggested actions, above the composer. A toolbar with one tab
|
|
42
|
+
* stop (arrow keys, Home and End move between chips), edges that fade only while there is more to scroll to, the mouse wheel
|
|
43
|
+
* scrolling it sideways, and 44 px targets on a coarse pointer. A chip never sends: it hands the person's composer a prompt to
|
|
44
|
+
* read, edit and send.
|
|
45
|
+
*/
|
|
46
|
+
export function AgentSuggestionRow({ suggestions: raw, onSelect, copy, className, }) {
|
|
47
|
+
const c = useCopy(ROW_COPY, copy);
|
|
48
|
+
const suggestions = useMemo(() => sanitizeSuggestions(raw, MAX_SUGGESTED_ACTIONS), [raw]);
|
|
49
|
+
const scroller = useRef(null);
|
|
50
|
+
const chips = useRef([]);
|
|
51
|
+
const [active, setActive] = useState(0);
|
|
52
|
+
// Fades are for the START and END of the row; which side of the screen that is depends on the writing direction.
|
|
53
|
+
const [edges, setEdges] = useState({ start: false, end: false, rtl: false });
|
|
54
|
+
const hasChips = suggestions.length > 0;
|
|
55
|
+
const measure = useCallback(() => {
|
|
56
|
+
const el = scroller.current;
|
|
57
|
+
if (!el)
|
|
58
|
+
return;
|
|
59
|
+
// In a right-to-left row `scrollLeft` is 0 at the start and counts down: its size is what matters.
|
|
60
|
+
const from = Math.abs(el.scrollLeft);
|
|
61
|
+
const next = {
|
|
62
|
+
start: from > 1,
|
|
63
|
+
end: from + el.clientWidth < el.scrollWidth - 1,
|
|
64
|
+
rtl: getComputedStyle(el).direction === "rtl",
|
|
65
|
+
};
|
|
66
|
+
setEdges((prev) => prev.start === next.start && prev.end === next.end && prev.rtl === next.rtl ? prev : next);
|
|
67
|
+
}, []);
|
|
68
|
+
useLayoutEffect(measure, [measure, suggestions, hasChips]);
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
const el = scroller.current;
|
|
71
|
+
if (!hasChips || !el || typeof ResizeObserver === "undefined")
|
|
72
|
+
return;
|
|
73
|
+
const ro = new ResizeObserver(measure);
|
|
74
|
+
ro.observe(el);
|
|
75
|
+
return () => ro.disconnect();
|
|
76
|
+
}, [measure, hasChips]);
|
|
77
|
+
// A vertical wheel scrolls the row along its writing direction, but only while the row can move that way (otherwise the page
|
|
78
|
+
// scrolls). React's `onWheel` is passive and cannot cancel the page, so this is a native, non-passive listener.
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
const el = scroller.current;
|
|
81
|
+
if (!hasChips || !el)
|
|
82
|
+
return;
|
|
83
|
+
const onWheel = (e) => {
|
|
84
|
+
if (e.deltaX !== 0 || e.deltaY === 0 || e.ctrlKey)
|
|
85
|
+
return;
|
|
86
|
+
const room = el.scrollWidth - el.clientWidth;
|
|
87
|
+
const from = Math.abs(el.scrollLeft); // distance from the start edge, in either direction
|
|
88
|
+
if (room <= 1 || (e.deltaY > 0 ? from >= room - 1 : from <= 1))
|
|
89
|
+
return;
|
|
90
|
+
el.scrollLeft += getComputedStyle(el).direction === "rtl" ? -e.deltaY : e.deltaY;
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
};
|
|
93
|
+
el.addEventListener("wheel", onWheel, { passive: false });
|
|
94
|
+
return () => el.removeEventListener("wheel", onWheel);
|
|
95
|
+
}, [hasChips]);
|
|
96
|
+
const last = suggestions.length - 1;
|
|
97
|
+
const index = Math.min(active, Math.max(0, last));
|
|
98
|
+
function move(to) {
|
|
99
|
+
const next = Math.max(0, Math.min(last, to));
|
|
100
|
+
setActive(next);
|
|
101
|
+
const chip = chips.current[next];
|
|
102
|
+
chip?.focus();
|
|
103
|
+
chip?.scrollIntoView?.({ block: "nearest", inline: "nearest" });
|
|
104
|
+
}
|
|
105
|
+
if (!hasChips)
|
|
106
|
+
return null;
|
|
107
|
+
const left = edges.rtl ? edges.end : edges.start;
|
|
108
|
+
const right = edges.rtl ? edges.start : edges.end;
|
|
109
|
+
return (_jsx("div", { ref: scroller, role: "toolbar", "aria-label": c.label, "aria-orientation": "horizontal", onScroll: measure, onKeyDown: (e) => {
|
|
110
|
+
const dir = getComputedStyle(e.currentTarget).direction === "rtl" ? -1 : 1;
|
|
111
|
+
if (e.key === "ArrowRight")
|
|
112
|
+
move(index + dir);
|
|
113
|
+
else if (e.key === "ArrowLeft")
|
|
114
|
+
move(index - dir);
|
|
115
|
+
else if (e.key === "Home")
|
|
116
|
+
move(0);
|
|
117
|
+
else if (e.key === "End")
|
|
118
|
+
move(last);
|
|
119
|
+
else
|
|
120
|
+
return;
|
|
121
|
+
e.preventDefault();
|
|
122
|
+
},
|
|
123
|
+
// `px-1 scroll-px-4`: room for the focus ring at both ends, and a chip scrolled into view clears the fade.
|
|
124
|
+
className: cn("flex snap-x gap-2 overflow-x-auto overscroll-x-contain px-1 py-1 scroll-px-4 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", left && "mask-l-from-[calc(100%-1rem)]", right && "mask-r-from-[calc(100%-1rem)]", className), children: suggestions.map((s, i) => (_jsxs("button", { ref: (el) => {
|
|
125
|
+
chips.current[i] = el;
|
|
126
|
+
}, type: "button", tabIndex: i === index ? 0 : -1, title: s.label, onFocus: () => setActive(i), onClick: () => onSelect(s), className: cn(agentChip, "max-w-none shrink-0 snap-start transition-[background-color,color] duration-[var(--duration-micro)] ease-[var(--ease-emphasized)] hover:bg-muted hover:text-foreground motion-reduce:transition-none", focusRing), children: [_jsx(CornerDownRight, { "aria-hidden": true, className: "size-3 shrink-0 rtl:-scale-x-100" }), _jsx("span", { className: "max-w-3xs truncate", children: s.label })] }, s.id))) }));
|
|
127
|
+
}
|
|
128
|
+
const FOLLOW_UP_COPY = {
|
|
129
|
+
label: "Follow-up questions",
|
|
130
|
+
hint: "Up from the message field to enter. Up and down to move, Enter to use, Escape to close.",
|
|
131
|
+
dismiss: "Close follow-up questions",
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* @internal The follow-up palette that follows an answer: a short listbox the keyboard drives (up and down move, Enter uses the
|
|
135
|
+
* row, Escape closes it, ArrowDown on the last row returns to the field). One tab stop; the active row is announced through
|
|
136
|
+
* `aria-activedescendant` and tinted only while the list has focus. Entering from the message field lands on the NEAREST (last)
|
|
137
|
+
* row. Like a suggested action, a row only fills the composer.
|
|
138
|
+
*/
|
|
139
|
+
export const AgentFollowUps = ({ followUps: raw, onSelect, onDismiss, onLeaveDown, hintId, copy, className, }) => {
|
|
140
|
+
const c = useCopy(FOLLOW_UP_COPY, copy);
|
|
141
|
+
const followUps = useMemo(() => sanitizeSuggestions(raw, MAX_FOLLOW_UPS), [raw]);
|
|
142
|
+
const listId = useId();
|
|
143
|
+
const ownHint = useId();
|
|
144
|
+
const hint = hintId ?? ownHint;
|
|
145
|
+
const [active, setActive] = useState(0);
|
|
146
|
+
const last = followUps.length - 1;
|
|
147
|
+
const index = Math.min(active, Math.max(0, last));
|
|
148
|
+
if (followUps.length === 0)
|
|
149
|
+
return null;
|
|
150
|
+
const optionId = (i) => `${listId}-o${i}`;
|
|
151
|
+
return (_jsxs("div", { className: cn("agent-fade-in flex flex-col gap-1", className), children: [_jsx("div", { id: listId, role: "listbox", "aria-label": c.label, "aria-describedby": hint, "aria-activedescendant": optionId(index), tabIndex: 0, onFocus: (e) => {
|
|
152
|
+
// Coming up from the message field lands on the row nearest to it.
|
|
153
|
+
if (e.relatedTarget instanceof HTMLElement &&
|
|
154
|
+
e.relatedTarget.hasAttribute("data-agent-composer-field"))
|
|
155
|
+
setActive(last);
|
|
156
|
+
}, onKeyDown: (e) => {
|
|
157
|
+
if (e.key === "ArrowDown") {
|
|
158
|
+
if (index === last && onLeaveDown)
|
|
159
|
+
onLeaveDown();
|
|
160
|
+
else
|
|
161
|
+
setActive(Math.min(last, index + 1));
|
|
162
|
+
}
|
|
163
|
+
else if (e.key === "ArrowUp")
|
|
164
|
+
setActive(Math.max(0, index - 1));
|
|
165
|
+
else if (e.key === "Home")
|
|
166
|
+
setActive(0);
|
|
167
|
+
else if (e.key === "End")
|
|
168
|
+
setActive(last);
|
|
169
|
+
else if (e.key === "Enter") {
|
|
170
|
+
const row = followUps[index];
|
|
171
|
+
if (row)
|
|
172
|
+
onSelect(row);
|
|
173
|
+
}
|
|
174
|
+
else if (e.key === "Escape") {
|
|
175
|
+
// A dialog around the panel listens for Escape too: this one belongs to the palette. (Stopping here covers bubble-phase
|
|
176
|
+
// listeners; a capture-phase listener such as Radix's DismissableLayer runs first and is not stopped. A host whose dock
|
|
177
|
+
// closes on Escape should check `defaultPrevented`, as admin's does.)
|
|
178
|
+
e.stopPropagation();
|
|
179
|
+
onDismiss();
|
|
180
|
+
}
|
|
181
|
+
else
|
|
182
|
+
return;
|
|
183
|
+
e.preventDefault();
|
|
184
|
+
}, className: cn("group flex flex-col overflow-hidden rounded-lg ring-1 ring-border/60", focusRing), children: followUps.map((f, i) => (_jsxs("div", { id: optionId(i), role: "option", "aria-selected": i === index, title: f.label, onMouseEnter: () => setActive(i), onClick: () => onSelect(f), className: cn("flex min-h-9 cursor-pointer items-center gap-2 px-3 py-1.5 text-sm/5 text-foreground hover:bg-muted pointer-coarse:min-h-11 not-first:border-t not-first:border-border/60", i === index && "group-focus-visible:bg-muted"), children: [_jsx(CornerDownRight, { "aria-hidden": true, className: "size-3.5 shrink-0 text-muted-foreground rtl:-scale-x-100" }), _jsx("span", { className: "min-w-0 break-words", children: f.label })] }, f.id))) }), _jsxs("div", { className: "flex items-center justify-between gap-2 px-1", children: [_jsx("p", { id: hint, className: "text-xs/4 text-muted-foreground pointer-coarse:hidden", children: c.hint }), _jsx("button", { type: "button", onClick: onDismiss, className: agentButton.ghost, children: c.dismiss })] })] }));
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=suggestions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suggestions.js","sourceRoot":"","sources":["../../src/agent/suggestions.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,WAAW,EACX,SAAS,EACT,KAAK,EACL,eAAe,EACf,OAAO,EACP,MAAM,EACN,QAAQ,GAET,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAYzD,6HAA6H;AAC7H,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,CAAC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAEzC,mIAAmI;AACnI,yHAAyH;AACzH,MAAM,WAAW,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC;AAEtF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAkB,EAAU,EAAE,CAC7D,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEhD,6HAA6H;AAC7H,MAAM,UAAU,mBAAmB,CACjC,IAA4C,EAC5C,GAAW;IAEX,MAAM,GAAG,GAAsB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;YAAE,MAAM;QAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,sIAAsI;QACtI,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACvC,6EAA6E;QAC7E,GAAG,CAAC,IAAI,CACN,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,SAAS,KAAK,KAAK;YAC3C,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE;YACpC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAMD,MAAM,QAAQ,GAA2B,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;AASxE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,WAAW,EAAE,GAAG,EAChB,QAAQ,EACR,IAAI,EACJ,SAAS,GACe;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,qBAAqB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1F,MAAM,QAAQ,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAkC,EAAE,CAAC,CAAC;IAC1D,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,iHAAiH;IACjH,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,mGAAmG;QACnG,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,IAAI,GAAG,CAAC;YACf,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,GAAG,CAAC;YAC/C,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,KAAK,KAAK;SAC9C,CAAC;QACF,QAAQ,CAAC,CAAC,IAAI,EAAE,EAAE,CAChB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAC1F,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,eAAe,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,IAAI,OAAO,cAAc,KAAK,WAAW;YAAE,OAAO;QACtE,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;QACvC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACf,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IAC/B,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAExB,6HAA6H;IAC7H,gHAAgH;IAChH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC5B,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE;YAAE,OAAO;QAC7B,MAAM,OAAO,GAAG,CAAC,CAAa,EAAE,EAAE;YAChC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO;YAC1D,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC;YAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,oDAAoD;YAC1F,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;gBAAE,OAAO;YACvE,EAAE,CAAC,UAAU,IAAI,gBAAgB,CAAC,EAAE,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACjF,CAAC,CAAC,cAAc,EAAE,CAAC;QACrB,CAAC,CAAC;QACF,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1D,OAAO,GAAG,EAAE,CAAC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,SAAS,IAAI,CAAC,EAAU;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,SAAS,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,EAAE,KAAK,EAAE,CAAC;QACd,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC;IAClD,OAAO,CACL,cACE,GAAG,EAAE,QAAQ,EACb,IAAI,EAAC,SAAS,gBACF,CAAC,CAAC,KAAK,sBACF,YAAY,EAC7B,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;YACf,MAAM,GAAG,GAAG,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,CAAC,CAAC,GAAG,KAAK,YAAY;gBAAE,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;iBACzC,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW;gBAAE,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;iBAC7C,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;gBAAE,IAAI,CAAC,CAAC,CAAC,CAAC;iBAC9B,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;;gBAChC,OAAO;YACZ,CAAC,CAAC,cAAc,EAAE,CAAC;QACrB,CAAC;QACD,2GAA2G;QAC3G,SAAS,EAAE,EAAE,CACX,mIAAmI,EACnI,IAAI,IAAI,+BAA+B,EACvC,KAAK,IAAI,+BAA+B,EACxC,SAAS,CACV,YAEA,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACzB,kBAEE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;gBACV,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACxB,CAAC,EACD,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC9B,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,SAAS,EAAE,EAAE,CACX,SAAS,EACT,sMAAsM,EACtM,SAAS,CACV,aAED,KAAC,eAAe,yBAAa,SAAS,EAAC,kCAAkC,GAAG,EAC5E,eAAM,SAAS,EAAC,oBAAoB,YAAE,CAAC,CAAC,KAAK,GAAQ,KAhBhD,CAAC,CAAC,EAAE,CAiBF,CACV,CAAC,GACE,CACP,CAAC;AACJ,CAAC;AAUD,MAAM,cAAc,GAAuB;IACzC,KAAK,EAAE,qBAAqB;IAC5B,IAAI,EAAE,yFAAyF;IAC/F,OAAO,EAAE,2BAA2B;CACrC,CAAC;AAeF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAC7B,SAAS,EAAE,GAAG,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,MAAM,EACN,IAAI,EACJ,SAAS,GACW,EAAE,EAAE;IACxB,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACxB,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAC;IAC/B,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAClD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC;IAClD,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,mCAAmC,EAAE,SAAS,CAAC,aAChE,cACE,EAAE,EAAE,MAAM,EACV,IAAI,EAAC,SAAS,gBACF,CAAC,CAAC,KAAK,sBACD,IAAI,2BACC,QAAQ,CAAC,KAAK,CAAC,EACtC,QAAQ,EAAE,CAAC,EACX,OAAO,EAAE,CAAC,CAA6B,EAAE,EAAE;oBACzC,mEAAmE;oBACnE,IACE,CAAC,CAAC,aAAa,YAAY,WAAW;wBACtC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,2BAA2B,CAAC;wBAEzD,SAAS,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC,EACD,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;oBACf,IAAI,CAAC,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;wBAC1B,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW;4BAAE,WAAW,EAAE,CAAC;;4BAC5C,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC5C,CAAC;yBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS;wBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;yBAC7D,IAAI,CAAC,CAAC,GAAG,KAAK,MAAM;wBAAE,SAAS,CAAC,CAAC,CAAC,CAAC;yBACnC,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;wBAAE,SAAS,CAAC,IAAI,CAAC,CAAC;yBACrC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;wBAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;wBAC7B,IAAI,GAAG;4BAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC;yBAAM,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;wBAC9B,wHAAwH;wBACxH,wHAAwH;wBACxH,sEAAsE;wBACtE,CAAC,CAAC,eAAe,EAAE,CAAC;wBACpB,SAAS,EAAE,CAAC;oBACd,CAAC;;wBAAM,OAAO;oBACd,CAAC,CAAC,cAAc,EAAE,CAAC;gBACrB,CAAC,EACD,SAAS,EAAE,EAAE,CACX,sEAAsE,EACtE,SAAS,CACV,YAEA,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACvB,eAEE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EACf,IAAI,EAAC,QAAQ,mBACE,CAAC,KAAK,KAAK,EAC1B,KAAK,EAAE,CAAC,CAAC,KAAK,EACd,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAChC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,EAC1B,SAAS,EAAE,EAAE,CACX,2KAA2K,EAC3K,CAAC,KAAK,KAAK,IAAI,8BAA8B,CAC9C,aAED,KAAC,eAAe,yBAEd,SAAS,EAAC,0DAA0D,GACpE,EACF,eAAM,SAAS,EAAC,qBAAqB,YAAE,CAAC,CAAC,KAAK,GAAQ,KAhBjD,CAAC,CAAC,EAAE,CAiBL,CACP,CAAC,GACE,EACN,eAAK,SAAS,EAAC,8CAA8C,aAC3D,YAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAC,uDAAuD,YAC3E,CAAC,CAAC,IAAI,GACL,EACJ,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,KAAK,YACnE,CAAC,CAAC,OAAO,GACH,IACL,IACF,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** `raw` cleaned by the rule above. `keepBreaks` leaves newline and tab alone (a multi-line prompt). Not trimmed, not clipped. */
|
|
2
|
+
export declare function cleanText(raw: string, keepBreaks?: boolean): string;
|
|
3
|
+
/**
|
|
4
|
+
* Bounds the WORK: at most this much of the input is cleaned, so a megabyte is not cleaned to show 80 characters. Input padded
|
|
5
|
+
* with more than this many invisible characters before its visible text may be cut short (the text is read first, then cleaned).
|
|
6
|
+
*/
|
|
7
|
+
export declare const WORK_LIMIT = 10000;
|
|
8
|
+
/** One line of display text: cleaned, whitespace collapsed, trimmed, cut at `max` code points. `undefined` when nothing is left. */
|
|
9
|
+
export declare function cleanLine(raw: unknown, max: number, ellipsis?: boolean): string | undefined;
|
|
10
|
+
/** Text for the composer: cleaned (line breaks and tabs kept), trimmed, cut at `max` code points. */
|
|
11
|
+
export declare function cleanPromptText(raw: unknown, max: number): string;
|
|
12
|
+
//# sourceMappingURL=text-clean.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-clean.d.ts","sourceRoot":"","sources":["../../src/agent/text-clean.ts"],"names":[],"mappings":"AA2BA,kIAAkI;AAClI,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,UAAQ,GAAG,MAAM,CAMjE;AAQD;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAS,CAAC;AAEjC,oIAAoI;AACpI,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,MAAM,GAAG,SAAS,CAOzF;AAED,qGAAqG;AACrG,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAIjE"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal The cleaning rule for text a person may read, edit and send (mention names, details, context labels, quotes, prompts).
|
|
3
|
+
*
|
|
4
|
+
* - Format and default-ignorable characters are REMOVED: direction controls and isolates, zero-width space, word joiner, the BOM,
|
|
5
|
+
* soft hyphen, combining grapheme joiner, Mongolian and other variation selectors, Khmer inherent vowels, the Hangul fillers,
|
|
6
|
+
* and the tag block. Removed, not spaced: they are invisible, so a space would show where none was.
|
|
7
|
+
* - EXCEPT the joiners a script or an emoji needs: ZWNJ (U+200C, Persian and others), ZWJ (U+200D, emoji sequences) and the emoji
|
|
8
|
+
* and text presentation selectors VS16 (U+FE0F) and VS15 (U+FE0E), as in @cellarnode/mcp. Every other variation selector is removed.
|
|
9
|
+
* - Controls (C0, DEL, C1) and the line and paragraph separators become a SPACE, so nothing is silently joined into another word.
|
|
10
|
+
* - A lone surrogate becomes U+FFFD (well formed text).
|
|
11
|
+
*
|
|
12
|
+
* `role-cards/text-safety.ts` has an older, blunter rule (it spaces ZWJ and ZWNJ); aligning it is CEL-2569.
|
|
13
|
+
*/
|
|
14
|
+
const REMOVE = /[\p{Cf}\p{Default_Ignorable_Code_Point}]/gu;
|
|
15
|
+
const KEEP = new Set([0x200c, 0x200d, 0xfe0e, 0xfe0f]);
|
|
16
|
+
const TO_SPACE = /[\p{Cc}\p{Zl}\p{Zp}]/gu;
|
|
17
|
+
const wellFormed = (s) => {
|
|
18
|
+
const w = s.toWellFormed;
|
|
19
|
+
return typeof w === "function"
|
|
20
|
+
? w.call(s)
|
|
21
|
+
: s.replace(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g, "\uFFFD");
|
|
22
|
+
};
|
|
23
|
+
/** `raw` cleaned by the rule above. `keepBreaks` leaves newline and tab alone (a multi-line prompt). Not trimmed, not clipped. */
|
|
24
|
+
export function cleanText(raw, keepBreaks = false) {
|
|
25
|
+
return wellFormed(raw)
|
|
26
|
+
.replace(REMOVE, (ch) => (KEEP.has(ch.codePointAt(0) ?? 0) ? ch : ""))
|
|
27
|
+
.replace(TO_SPACE, (ch) => keepBreaks && (ch === "\n" || ch === "\t" || ch === "\r") ? ch : " ");
|
|
28
|
+
}
|
|
29
|
+
/** The first `max` code points, never splitting a pair; `ellipsis` marks a cut. */
|
|
30
|
+
const clip = (text, max, ellipsis) => {
|
|
31
|
+
const chars = Array.from(text);
|
|
32
|
+
return chars.length <= max ? text : chars.slice(0, max).join("") + (ellipsis ? "\u2026" : "");
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Bounds the WORK: at most this much of the input is cleaned, so a megabyte is not cleaned to show 80 characters. Input padded
|
|
36
|
+
* with more than this many invisible characters before its visible text may be cut short (the text is read first, then cleaned).
|
|
37
|
+
*/
|
|
38
|
+
export const WORK_LIMIT = 10_000;
|
|
39
|
+
/** One line of display text: cleaned, whitespace collapsed, trimmed, cut at `max` code points. `undefined` when nothing is left. */
|
|
40
|
+
export function cleanLine(raw, max, ellipsis = false) {
|
|
41
|
+
if (typeof raw !== "string")
|
|
42
|
+
return undefined;
|
|
43
|
+
// Cleaned before it is cut to `max`, so a run of zero-width spaces cannot use up the room meant for the name (within WORK_LIMIT).
|
|
44
|
+
const flat = cleanText(clip(raw, WORK_LIMIT, false))
|
|
45
|
+
.replace(/\s+/g, " ")
|
|
46
|
+
.trim();
|
|
47
|
+
return flat === "" ? undefined : clip(flat, max, ellipsis);
|
|
48
|
+
}
|
|
49
|
+
/** Text for the composer: cleaned (line breaks and tabs kept), trimmed, cut at `max` code points. */
|
|
50
|
+
export function cleanPromptText(raw, max) {
|
|
51
|
+
return typeof raw === "string"
|
|
52
|
+
? clip(cleanText(clip(raw, WORK_LIMIT, false), true).trim(), max, false)
|
|
53
|
+
: "";
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=text-clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-clean.js","sourceRoot":"","sources":["../../src/agent/text-clean.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,GAAG,4CAA4C,CAAC;AAC5D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AACvD,MAAM,QAAQ,GAAG,wBAAwB,CAAC;AAE1C,MAAM,UAAU,GAAG,CAAC,CAAS,EAAU,EAAE;IACvC,MAAM,CAAC,GAAI,CAAgD,CAAC,YAAY,CAAC;IACzE,OAAO,OAAO,CAAC,KAAK,UAAU;QAC5B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC,CAAC,OAAO,CACP,yEAAyE,EACzE,QAAQ,CACT,CAAC;AACR,CAAC,CAAC;AAEF,kIAAkI;AAClI,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,UAAU,GAAG,KAAK;IACvD,OAAO,UAAU,CAAC,GAAG,CAAC;SACnB,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACrE,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CACxB,UAAU,IAAI,CAAC,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CACrE,CAAC;AACN,CAAC;AAED,mFAAmF;AACnF,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,GAAW,EAAE,QAAiB,EAAU,EAAE;IACpE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAChG,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAEjC,oIAAoI;AACpI,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,GAAW,EAAE,QAAQ,GAAG,KAAK;IACnE,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9C,kIAAkI;IAClI,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;SACjD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;SACpB,IAAI,EAAE,CAAC;IACV,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,eAAe,CAAC,GAAY,EAAE,GAAW;IACvD,OAAO,OAAO,GAAG,KAAK,QAAQ;QAC5B,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC;QACxE,CAAC,CAAC,EAAE,CAAC;AACT,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AgentThread } from "./schema.js";
|
|
2
|
+
import { THREAD_TITLE_MAX } from "./thread-title.js";
|
|
2
3
|
export interface AgentThreadListCopy {
|
|
3
4
|
search: string;
|
|
4
5
|
noResults: string;
|
|
@@ -27,8 +28,17 @@ export interface AgentThreadListCopy {
|
|
|
27
28
|
/** `{max}` is the longest title allowed. */
|
|
28
29
|
titleTooLong: string;
|
|
29
30
|
}
|
|
30
|
-
/**
|
|
31
|
-
|
|
31
|
+
/**
|
|
32
|
+
* What `onRename` rejects with when the service refused the title and said why ("Use 80 characters or fewer."): the list
|
|
33
|
+
* shows that reason, in the service's own words, instead of the generic `renameError`. Any other rejection (a network error,
|
|
34
|
+
* a 500) shows the generic copy, so an internal message never reaches the screen. Matched by `name`, so a copy of this class
|
|
35
|
+
* from a second bundle of the package still counts.
|
|
36
|
+
*/
|
|
37
|
+
export declare class AgentThreadRenameError extends Error {
|
|
38
|
+
constructor(reason: string);
|
|
39
|
+
}
|
|
40
|
+
/** The longest title a person can give a conversation, in code points (see `thread-title.ts`); the service counts the same way. */
|
|
41
|
+
export { THREAD_TITLE_MAX };
|
|
32
42
|
/**
|
|
33
43
|
* A title taken from the first thing the user asked: whitespace collapsed, cut at a word boundary near `max`
|
|
34
44
|
* characters with an ellipsis. `undefined` for nothing to take a title from.
|
|
@@ -42,8 +52,10 @@ export interface AgentThreadListProps {
|
|
|
42
52
|
onSelect: (id: string) => void;
|
|
43
53
|
onDelete: (id: string) => void;
|
|
44
54
|
/**
|
|
45
|
-
* Saves a new title (
|
|
46
|
-
*
|
|
55
|
+
* Saves a new title (the one the service will store: cleaned of control, format and blank characters and of extra whitespace,
|
|
56
|
+
* 1 to {@link THREAD_TITLE_MAX} code points, with a letter, number, symbol or punctuation in it). Without it a row has no rename
|
|
57
|
+
* button. A rejected promise shows the rename error and keeps the field open with what was typed; reject with an
|
|
58
|
+
* {@link AgentThreadRenameError} to show the service's reason instead of the generic one.
|
|
47
59
|
*/
|
|
48
60
|
onRename?: (id: string, title: string) => Promise<void>;
|
|
49
61
|
retentionDays?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-list.d.ts","sourceRoot":"","sources":["../../src/agent/thread-list.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"thread-list.d.ts","sourceRoot":"","sources":["../../src/agent/thread-list.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAG5C,OAAO,EAIL,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAIxB,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,sFAAsF;IACtF,eAAe,EAAE,MAAM,CAAC;IACxB,0FAA0F;IAC1F,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,YAAY,EAAE,MAAM,CAAC;CACtB;AAgCD;;;;;GAKG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,MAAM,EAAE,MAAM;CAI3B;AAWD,mIAAmI;AACnI,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAG5B;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,GAAG,GAAE,MAA0B,GAC9B,MAAM,GAAG,SAAS,CAQpB;AAED,iHAAiH;AACjH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA8JD,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,aAAkB,EAClB,UAAqB,EACrB,IAAI,EACJ,SAAS,GACV,EAAE,oBAAoB,2CAsItB"}
|
|
@@ -5,7 +5,9 @@ import { ConfirmationDialog } from "../components/confirmation-dialog.js";
|
|
|
5
5
|
import { LiveRegion, useAnnounce } from "../components/live-region/index.js";
|
|
6
6
|
import { cn } from "../lib/utils.js";
|
|
7
7
|
import { fmt, useCopy } from "./copy.js";
|
|
8
|
+
import { cleanInline } from "./role-cards/text-safety.js";
|
|
8
9
|
import { AgentEmptyState } from "./states.js";
|
|
10
|
+
import { cleanTitleText, isBlankTitle, normalizeThreadTitle, THREAD_TITLE_MAX, } from "./thread-title.js";
|
|
9
11
|
import { focusRing } from "./ui.js";
|
|
10
12
|
import { useChanged } from "./use-motion.js";
|
|
11
13
|
const DEFAULT_COPY = {
|
|
@@ -30,14 +32,32 @@ const DEFAULT_COPY = {
|
|
|
30
32
|
titleTooLong: "Use {max} characters or fewer.",
|
|
31
33
|
};
|
|
32
34
|
/**
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
35
|
+
* The title a thread carries, trimmed; "" when it has none. A title that draws nothing is no title: one with no letter, number,
|
|
36
|
+
* symbol or punctuation once cleaned (`thread-title.ts`: whitespace, control and format characters, the Hangul fillers, the Braille
|
|
37
|
+
* blank, combining marks, private-use and unassigned code points alone). That is a test only: the title shown is the one the
|
|
38
|
+
* service stored.
|
|
37
39
|
*/
|
|
38
|
-
const
|
|
39
|
-
/**
|
|
40
|
-
|
|
40
|
+
const titleOf = (thread) => isBlankTitle(thread.title) ? "" : thread.title.trim();
|
|
41
|
+
/**
|
|
42
|
+
* What `onRename` rejects with when the service refused the title and said why ("Use 80 characters or fewer."): the list
|
|
43
|
+
* shows that reason, in the service's own words, instead of the generic `renameError`. Any other rejection (a network error,
|
|
44
|
+
* a 500) shows the generic copy, so an internal message never reaches the screen. Matched by `name`, so a copy of this class
|
|
45
|
+
* from a second bundle of the package still counts.
|
|
46
|
+
*/
|
|
47
|
+
export class AgentThreadRenameError extends Error {
|
|
48
|
+
constructor(reason) {
|
|
49
|
+
super(reason);
|
|
50
|
+
this.name = "AgentThreadRenameError";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Longest reason shown, in code points. */
|
|
54
|
+
const RENAME_REASON_MAX = 200;
|
|
55
|
+
/** The reason a refused rename carries, cleaned of control and bidi characters, or `undefined` for any other failure. */
|
|
56
|
+
const renameReason = (e) => e instanceof Error && e.name === "AgentThreadRenameError"
|
|
57
|
+
? cleanInline(e.message, RENAME_REASON_MAX, true)
|
|
58
|
+
: undefined;
|
|
59
|
+
/** The longest title a person can give a conversation, in code points (see `thread-title.ts`); the service counts the same way. */
|
|
60
|
+
export { THREAD_TITLE_MAX };
|
|
41
61
|
const DERIVED_TITLE_MAX = 48;
|
|
42
62
|
/**
|
|
43
63
|
* A title taken from the first thing the user asked: whitespace collapsed, cut at a word boundary near `max`
|
|
@@ -45,7 +65,7 @@ const DERIVED_TITLE_MAX = 48;
|
|
|
45
65
|
*/
|
|
46
66
|
export function deriveThreadTitle(firstMessage, max = DERIVED_TITLE_MAX) {
|
|
47
67
|
const text = (firstMessage ?? "").replace(/\s+/g, " ").trim();
|
|
48
|
-
if (
|
|
68
|
+
if (isBlankTitle(text))
|
|
49
69
|
return undefined;
|
|
50
70
|
const chars = [...text];
|
|
51
71
|
if (chars.length <= max)
|
|
@@ -56,8 +76,7 @@ export function deriveThreadTitle(firstMessage, max = DERIVED_TITLE_MAX) {
|
|
|
56
76
|
}
|
|
57
77
|
/** What the list calls a conversation: its title, else the first words of its first message, else `fallback`. */
|
|
58
78
|
export function threadDisplayTitle(thread, fallback) {
|
|
59
|
-
|
|
60
|
-
return clean(title) === "" ? deriveThreadTitle(thread.firstMessage) || fallback : title;
|
|
79
|
+
return titleOf(thread) || deriveThreadTitle(thread.firstMessage) || fallback;
|
|
61
80
|
}
|
|
62
81
|
function RenameField({ initial, c, onSave, onClose, }) {
|
|
63
82
|
const [value, setValue] = useState(initial);
|
|
@@ -70,11 +89,6 @@ function RenameField({ initial, c, onSave, onClose, }) {
|
|
|
70
89
|
inputRef.current?.focus();
|
|
71
90
|
inputRef.current?.select();
|
|
72
91
|
}, []);
|
|
73
|
-
const validate = (title) => clean(title) === ""
|
|
74
|
-
? c.titleRequired
|
|
75
|
-
: [...title].length > THREAD_TITLE_MAX
|
|
76
|
-
? fmt(c.titleTooLong, { max: THREAD_TITLE_MAX })
|
|
77
|
-
: null;
|
|
78
92
|
const finish = (via, saved) => {
|
|
79
93
|
finishedRef.current = true;
|
|
80
94
|
onClose(via, saved);
|
|
@@ -82,17 +96,20 @@ function RenameField({ initial, c, onSave, onClose, }) {
|
|
|
82
96
|
const submit = async (via) => {
|
|
83
97
|
if (finishedRef.current || status === "saving")
|
|
84
98
|
return;
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
99
|
+
// The title the service will store (cleaned, then counted): what is checked here is what it checks, what is sent is what it keeps.
|
|
100
|
+
const normalized = normalizeThreadTitle(value);
|
|
101
|
+
if (!normalized.ok) {
|
|
88
102
|
// Enter says what is wrong and waits; clicking away from a field that cannot be saved just puts the old name back.
|
|
89
103
|
if (via === "blur")
|
|
90
104
|
finish("blur", false);
|
|
91
105
|
else
|
|
92
|
-
setProblem(
|
|
106
|
+
setProblem(normalized.reason === "empty"
|
|
107
|
+
? c.titleRequired
|
|
108
|
+
: fmt(c.titleTooLong, { max: THREAD_TITLE_MAX }));
|
|
93
109
|
return;
|
|
94
110
|
}
|
|
95
|
-
|
|
111
|
+
const title = normalized.title;
|
|
112
|
+
if (title === cleanTitleText(initial)) {
|
|
96
113
|
finish(via, false);
|
|
97
114
|
return;
|
|
98
115
|
}
|
|
@@ -102,9 +119,9 @@ function RenameField({ initial, c, onSave, onClose, }) {
|
|
|
102
119
|
await onSave(title);
|
|
103
120
|
finish(via, true);
|
|
104
121
|
}
|
|
105
|
-
catch {
|
|
122
|
+
catch (e) {
|
|
106
123
|
setStatus("error");
|
|
107
|
-
setProblem(c.renameError);
|
|
124
|
+
setProblem(renameReason(e) ?? c.renameError);
|
|
108
125
|
if (via === "keyboard")
|
|
109
126
|
inputRef.current?.focus();
|
|
110
127
|
}
|
|
@@ -134,9 +151,9 @@ function RenameField({ initial, c, onSave, onClose, }) {
|
|
|
134
151
|
}, onKeyDown: onKeyDown, onBlur: () => void submit("blur"), className: cn("min-w-0 flex-1 rounded-lg border bg-background px-2.5 py-1 text-sm/5 text-foreground pointer-coarse:min-h-11", problem ? "border-[var(--tone-danger-fg)]" : "border-input", saving && "text-muted-foreground", focusRing) }), saving && (_jsxs("span", { className: "inline-flex shrink-0 items-center text-muted-foreground", children: [_jsx(LoaderCircle, { "aria-hidden": true, className: "size-4 animate-spin motion-reduce:animate-none" }), _jsx("span", { className: "sr-only", children: c.renameSaving })] }))] }), problem ? (_jsx("p", { id: `${hintId}-problem`, role: "alert", className: "text-xs/4 break-words text-[var(--tone-danger-fg)]", children: problem }, "problem")) : (_jsx("p", { id: hintId, className: "text-xs/4 text-muted-foreground", children: c.renameHint }, "hint"))] }));
|
|
135
152
|
}
|
|
136
153
|
function ThreadTitle({ thread, c }) {
|
|
137
|
-
const naming = Boolean(thread.titlePending) && thread
|
|
154
|
+
const naming = Boolean(thread.titlePending) && titleOf(thread) === "";
|
|
138
155
|
const display = threadDisplayTitle(thread, c.newConversation);
|
|
139
|
-
const fallback = !naming && thread
|
|
156
|
+
const fallback = !naming && titleOf(thread) === "" && display === c.newConversation;
|
|
140
157
|
const shown = naming ? "\u0000naming" : display;
|
|
141
158
|
// A title that arrives or changes fades in. The first one shown does not animate.
|
|
142
159
|
const swapped = useChanged(shown);
|
|
@@ -163,7 +180,7 @@ export function AgentThreadList({ threads, activeId, onSelect, onDelete, onRenam
|
|
|
163
180
|
return (_jsxs("div", { className: cn("flex flex-col gap-3 px-4 pt-4 pb-3", className), children: [_jsx(LiveRegion, { message: message, seq: seq }), _jsx("input", { type: "search", "aria-label": c.search, placeholder: c.search, value: q, onChange: (e) => setQ(e.target.value), className: cn("w-full rounded-lg border border-input bg-background px-3 py-1.5 text-sm/5", focusRing) }), shown.length === 0 ? (_jsx("p", { className: "py-6 text-center text-sm/5 text-muted-foreground", children: c.noResults })) : (_jsx("ul", { "aria-label": c.list, className: "-mx-2 flex flex-col gap-1", children: shown.map((t) => {
|
|
164
181
|
const name = threadDisplayTitle(t, c.newConversation);
|
|
165
182
|
if (renamingId === t.id && onRename) {
|
|
166
|
-
return (_jsx("li", { children: _jsx(RenameField, { initial: t
|
|
183
|
+
return (_jsx("li", { children: _jsx(RenameField, { initial: titleOf(t) || name, c: c, onSave: (title) => onRename(t.id, title), onClose: (via, saved) => {
|
|
167
184
|
setRenamingId(null);
|
|
168
185
|
if (saved)
|
|
169
186
|
announce(c.renamed);
|
|
@@ -172,7 +189,7 @@ export function AgentThreadList({ threads, activeId, onSelect, onDelete, onRenam
|
|
|
172
189
|
window.setTimeout(() => selectButtonsRef.current.get(t.id)?.focus(), 0);
|
|
173
190
|
} }) }, t.id));
|
|
174
191
|
}
|
|
175
|
-
return (_jsxs("li", { "aria-busy": t.titlePending && t
|
|
192
|
+
return (_jsxs("li", { "aria-busy": t.titlePending && titleOf(t) === "" ? true : undefined, className: "group flex items-center gap-1 rounded-xl hover:bg-muted", children: [_jsxs("button", { type: "button", ref: (el) => {
|
|
176
193
|
if (el)
|
|
177
194
|
selectButtonsRef.current.set(t.id, el);
|
|
178
195
|
else
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thread-list.js","sourceRoot":"","sources":["../../src/agent/thread-list.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thread-list.js","sourceRoot":"","sources":["../../src/agent/thread-list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal CEL-2530 - the conversation title rules, the SAME ones the service applies when a title is saved, so the rename field
|
|
3
|
+
* refuses exactly what the service would (a 422 is then only version skew) and sends what it will store.
|
|
4
|
+
*
|
|
5
|
+
* MIRRORS the backend BFF (cellarnode-backend-v2 `features/agent-threads/rename-thread.ts`, `normalizeThreadTitle`) and the agents
|
|
6
|
+
* service (cellarnode-mcp `agents/src/thread-title.ts`, `parseUserTitle`). All three run the same vectors
|
|
7
|
+
* (`title-vectors.test.fixture.ts` here, `title-vectors.ts` in the others; byte-identical copies): change the rules in all three.
|
|
8
|
+
* Written as code points and property classes, never as literal characters, so this source carries no invisible text.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* The longest title a person can give a conversation, in code points: an emoji is one whatever its UTF-16 length, so 80 emoji
|
|
12
|
+
* fit and 81 do not. Counted AFTER cleaning (see {@link cleanTitleText}), as the service does.
|
|
13
|
+
*/
|
|
14
|
+
export declare const THREAD_TITLE_MAX = 80;
|
|
15
|
+
/**
|
|
16
|
+
* Collapses every whitespace run (newlines, tabs, line and paragraph separators and the Braille blank included) to one space, strips
|
|
17
|
+
* unsafe and blank-looking characters (a stripped character is simply gone: it does not make a space), and trims. The byte order
|
|
18
|
+
* mark is a format character that JavaScript also calls whitespace; it is stripped, not turned into a space.
|
|
19
|
+
*/
|
|
20
|
+
export declare function cleanTitleText(raw: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Every run of whitespace and blank or invisible code points (the Braille blank, the Hangul fillers, no-break and other spaces, zero-width
|
|
23
|
+
* and other format characters, the soft hyphen...; the joiners ZWJ and ZWNJ excepted) becomes ONE space. For text that is drawn rather than stored (a link's words): 700 blank glyphs would otherwise push
|
|
24
|
+
* whatever follows them hundreds of pixels away.
|
|
25
|
+
*/
|
|
26
|
+
export declare function collapseBlankRuns(raw: string): string;
|
|
27
|
+
export type NormalizedTitle = {
|
|
28
|
+
ok: true;
|
|
29
|
+
title: string;
|
|
30
|
+
} | {
|
|
31
|
+
ok: false;
|
|
32
|
+
reason: "empty";
|
|
33
|
+
} | {
|
|
34
|
+
ok: false;
|
|
35
|
+
reason: "too_long";
|
|
36
|
+
length: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* The title as it is stored: cleaned as above, with at least one visible character (a letter, number, symbol or punctuation: a
|
|
40
|
+
* title of combining marks, private-use or unassigned code points alone has none), and 1 to {@link THREAD_TITLE_MAX} code points
|
|
41
|
+
* counted after cleaning. Never silently shortened. `length` on a refusal is the CLEANED length.
|
|
42
|
+
*/
|
|
43
|
+
export declare function normalizeThreadTitle(raw: string): NormalizedTitle;
|
|
44
|
+
/** Whether `text` shows nothing as a title (see {@link normalizeThreadTitle}): no letter, number, symbol or punctuation once cleaned. */
|
|
45
|
+
export declare const isBlankTitle: (text: string) => boolean;
|
|
46
|
+
//# sourceMappingURL=thread-title.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-title.d.ts","sourceRoot":"","sources":["../../src/agent/thread-title.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AA2BnC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAclD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAarD;AAKD,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC9B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAMjE;AAED,yIAAyI;AACzI,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAA8C,CAAC"}
|