@agent-native/core 0.12.30 → 0.12.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/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +21 -5
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +10 -3
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +234 -23
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +9 -8
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +23 -4
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/components/ui/hover-card.d.ts +7 -0
- package/dist/client/components/ui/hover-card.d.ts.map +1 -0
- package/dist/client/components/ui/hover-card.js +10 -0
- package/dist/client/components/ui/hover-card.js.map +1 -0
- package/dist/client/composer/TiptapComposer.js +1 -1
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/dev-overlay/DevOverlay.d.ts.map +1 -1
- package/dist/client/dev-overlay/DevOverlay.js +5 -1
- package/dist/client/dev-overlay/DevOverlay.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.d.ts.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +3 -2
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/guided-questions.d.ts +77 -0
- package/dist/client/guided-questions.d.ts.map +1 -0
- package/dist/client/guided-questions.js +295 -0
- package/dist/client/guided-questions.js.map +1 -0
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +8 -1
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts +3 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +78 -12
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsSection.d.ts +2 -1
- package/dist/client/settings/SettingsSection.d.ts.map +1 -1
- package/dist/client/settings/SettingsSection.js +2 -2
- package/dist/client/settings/SettingsSection.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +4 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +76 -32
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareButton.spec.js +54 -7
- package/dist/client/sharing/ShareButton.spec.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +42 -5
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +12 -2
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +195 -53
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/server/core-routes-plugin.js +2 -2
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/google-auth-plugin.d.ts.map +1 -1
- package/dist/server/google-auth-plugin.js +18 -2
- package/dist/server/google-auth-plugin.js.map +1 -1
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +18 -2
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll-events.d.ts +12 -0
- package/dist/server/poll-events.d.ts.map +1 -0
- package/dist/server/poll-events.js +41 -0
- package/dist/server/poll-events.js.map +1 -0
- package/dist/server/poll.d.ts +4 -0
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +19 -12
- package/dist/server/poll.js.map +1 -1
- package/dist/templates/default/react-router.config.ts +1 -0
- package/package.json +2 -1
- package/src/templates/default/react-router.config.ts +1 -0
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { useQuery, useQueryClient } from "@tanstack/react-query";
|
|
4
|
+
import { IconCheck, IconChevronRight, IconHelpCircle, IconUpload, IconX, } from "@tabler/icons-react";
|
|
5
|
+
import { agentNativePath } from "./api-path.js";
|
|
6
|
+
import { sendToAgentChat } from "./agent-chat.js";
|
|
7
|
+
import { cn } from "./utils.js";
|
|
8
|
+
const OTHER_OPTION_PREFIX = "__other__:";
|
|
9
|
+
const EXPLORE_OPTION = {
|
|
10
|
+
label: "Explore a few options",
|
|
11
|
+
value: "__explore__",
|
|
12
|
+
description: "Show me a few distinct directions before committing.",
|
|
13
|
+
};
|
|
14
|
+
const DECIDE_OPTION = {
|
|
15
|
+
label: "Decide for me",
|
|
16
|
+
value: "__decide__",
|
|
17
|
+
description: "Use your judgment and keep moving.",
|
|
18
|
+
};
|
|
19
|
+
function isFileLike(value) {
|
|
20
|
+
return (typeof value === "object" &&
|
|
21
|
+
value !== null &&
|
|
22
|
+
"name" in value &&
|
|
23
|
+
typeof value.name === "string");
|
|
24
|
+
}
|
|
25
|
+
export function isOtherGuidedAnswer(value) {
|
|
26
|
+
return typeof value === "string" && value.startsWith(OTHER_OPTION_PREFIX);
|
|
27
|
+
}
|
|
28
|
+
export function getOtherGuidedAnswerText(value) {
|
|
29
|
+
return isOtherGuidedAnswer(value)
|
|
30
|
+
? value.slice(OTHER_OPTION_PREFIX.length)
|
|
31
|
+
: "";
|
|
32
|
+
}
|
|
33
|
+
export function makeOtherGuidedAnswer(text = "") {
|
|
34
|
+
return `${OTHER_OPTION_PREFIX}${text}`;
|
|
35
|
+
}
|
|
36
|
+
export function hasGuidedAnswer(value) {
|
|
37
|
+
if (value == null || value === "")
|
|
38
|
+
return false;
|
|
39
|
+
if (Array.isArray(value))
|
|
40
|
+
return value.some(hasGuidedAnswer);
|
|
41
|
+
if (isOtherGuidedAnswer(value)) {
|
|
42
|
+
return getOtherGuidedAnswerText(value).trim().length > 0;
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
export function formatGuidedAnswerValue(value) {
|
|
47
|
+
if (Array.isArray(value)) {
|
|
48
|
+
return value.map(formatGuidedAnswerValue).filter(hasGuidedAnswer);
|
|
49
|
+
}
|
|
50
|
+
if (isOtherGuidedAnswer(value)) {
|
|
51
|
+
const text = getOtherGuidedAnswerText(value).trim();
|
|
52
|
+
return text ? `Other: ${text}` : "";
|
|
53
|
+
}
|
|
54
|
+
if (isFileLike(value))
|
|
55
|
+
return value.name;
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
export function normalizeGuidedAnswers(answers) {
|
|
59
|
+
return Object.fromEntries(Object.entries(answers).map(([id, value]) => [
|
|
60
|
+
id,
|
|
61
|
+
formatGuidedAnswerValue(value),
|
|
62
|
+
]));
|
|
63
|
+
}
|
|
64
|
+
export function formatGuidedAnswersForAgent(answers) {
|
|
65
|
+
return Object.entries(normalizeGuidedAnswers(answers))
|
|
66
|
+
.filter(([, value]) => hasGuidedAnswer(value))
|
|
67
|
+
.map(([id, value]) => {
|
|
68
|
+
if (Array.isArray(value))
|
|
69
|
+
return `${id}: ${value.join(", ")}`;
|
|
70
|
+
return `${id}: ${String(value)}`;
|
|
71
|
+
})
|
|
72
|
+
.join("\n");
|
|
73
|
+
}
|
|
74
|
+
function optionKey(option) {
|
|
75
|
+
return `${option.value.toLowerCase()}::${option.label.toLowerCase()}`;
|
|
76
|
+
}
|
|
77
|
+
function withDefaultOptions(question) {
|
|
78
|
+
const base = question.options ?? question.choices ?? [];
|
|
79
|
+
const seen = new Set(base.map(optionKey));
|
|
80
|
+
const result = [...base];
|
|
81
|
+
const maybePush = (option, enabled) => {
|
|
82
|
+
if (!enabled)
|
|
83
|
+
return;
|
|
84
|
+
const key = optionKey(option);
|
|
85
|
+
const label = option.label.toLowerCase();
|
|
86
|
+
const value = option.value.toLowerCase();
|
|
87
|
+
const duplicate = result.some((existing) => optionKey(existing) === key ||
|
|
88
|
+
existing.label.toLowerCase() === label ||
|
|
89
|
+
existing.value.toLowerCase() === value);
|
|
90
|
+
if (duplicate || seen.has(key))
|
|
91
|
+
return;
|
|
92
|
+
seen.add(key);
|
|
93
|
+
result.push(option);
|
|
94
|
+
};
|
|
95
|
+
maybePush(EXPLORE_OPTION, question.includeExplore !== false);
|
|
96
|
+
maybePush(DECIDE_OPTION, question.includeDecide !== false);
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
export function GuidedQuestionFlow({ questions, onSubmit, onSkip, title = "A few choices before I generate", description = "Pick what you know. Use Other for anything that does not fit, or let the agent decide.", skipLabel = "Skip", submitLabel = "Continue", className, }) {
|
|
100
|
+
const [answers, setAnswers] = useState({});
|
|
101
|
+
useEffect(() => {
|
|
102
|
+
setAnswers({});
|
|
103
|
+
}, [questions]);
|
|
104
|
+
const setAnswer = useCallback((id, value) => {
|
|
105
|
+
setAnswers((prev) => ({ ...prev, [id]: value }));
|
|
106
|
+
}, []);
|
|
107
|
+
const allRequiredAnswered = questions
|
|
108
|
+
.filter((question) => question.required)
|
|
109
|
+
.every((question) => hasGuidedAnswer(answers[question.id]));
|
|
110
|
+
return (_jsx("div", { className: cn("flex h-full w-full items-center justify-center bg-background text-foreground", className), children: _jsxs("div", { className: "flex max-h-full w-full max-w-3xl flex-col px-4 py-6 sm:px-8 sm:py-10", children: [_jsxs("div", { className: "mb-6 flex items-start gap-3", children: [_jsx("div", { className: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-muted/40 text-primary", children: _jsx(IconHelpCircle, { className: "h-5 w-5" }) }), _jsxs("div", { className: "min-w-0", children: [_jsx("h2", { className: "text-xl font-semibold tracking-normal text-foreground sm:text-2xl", children: title }), description && (_jsx("p", { className: "mt-1 max-w-2xl text-sm leading-5 text-muted-foreground", children: description }))] })] }), _jsx("div", { className: "min-h-0 flex-1 space-y-4 overflow-y-auto pr-1", children: questions.map((question, index) => (_jsx(QuestionCard, { index: index, question: question, value: answers[question.id], onChange: (value) => setAnswer(question.id, value) }, question.id))) }), _jsxs("div", { className: "mt-5 flex shrink-0 items-center justify-between gap-4 border-t border-border pt-4", children: [_jsx("div", { className: "flex items-center gap-1.5", children: questions.map((question, index) => (_jsx("span", { className: cn("h-1.5 w-1.5 rounded-full", hasGuidedAnswer(answers[question.id])
|
|
111
|
+
? "bg-primary"
|
|
112
|
+
: "bg-muted-foreground/30") }, question.id || index))) }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("button", { type: "button", onClick: onSkip, className: "cursor-pointer rounded-md px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground", children: skipLabel }), _jsxs("button", { type: "button", onClick: () => onSubmit(normalizeGuidedAnswers(answers)), disabled: !allRequiredAnswered, className: "inline-flex cursor-pointer items-center gap-2 rounded-md bg-primary px-3.5 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-45", children: [submitLabel, _jsx(IconChevronRight, { className: "h-4 w-4" })] })] })] })] }) }));
|
|
113
|
+
}
|
|
114
|
+
function QuestionCard({ index, question, value, onChange, }) {
|
|
115
|
+
return (_jsxs("section", { className: "rounded-lg border border-border bg-card/65 p-4 shadow-sm", children: [_jsxs("div", { className: "mb-3 flex gap-3", children: [_jsx("div", { className: "flex h-6 min-w-6 items-center justify-center rounded-md bg-muted text-xs font-medium text-muted-foreground", children: index + 1 }), _jsxs("div", { className: "min-w-0", children: [question.header && (_jsx("p", { className: "mb-1 text-[11px] font-medium uppercase text-muted-foreground", children: question.header })), _jsxs("h3", { className: "text-sm font-medium leading-5 text-foreground", children: [question.question, question.required && (_jsx("span", { className: "ml-1 text-destructive", children: "*" }))] }), question.description && (_jsx("p", { className: "mt-1 text-xs leading-5 text-muted-foreground", children: question.description }))] })] }), question.type === "text-options" && (_jsx(TextOptions, { question: question, value: value, onChange: onChange })), question.type === "color-options" && (_jsx(ColorOptions, { question: question, value: value, onChange: onChange })), question.type === "slider" && (_jsx(SliderQuestion, { question: question, value: value, onChange: onChange })), question.type === "file" && (_jsx(FileDropZone, { value: value, onChange: onChange })), question.type === "freeform" && (_jsx("textarea", { value: typeof value === "string" ? value : "", onChange: (event) => onChange(event.target.value), placeholder: question.placeholder ?? "Type your answer...", className: "min-h-[84px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary" }))] }));
|
|
116
|
+
}
|
|
117
|
+
function TextOptions({ question, value, onChange, }) {
|
|
118
|
+
const options = useMemo(() => withDefaultOptions(question), [question]);
|
|
119
|
+
const multiSelect = question.multiSelect === true;
|
|
120
|
+
const selectedValues = Array.isArray(value) ? value : [];
|
|
121
|
+
const otherSelected = multiSelect
|
|
122
|
+
? selectedValues.some(isOtherGuidedAnswer)
|
|
123
|
+
: isOtherGuidedAnswer(value);
|
|
124
|
+
const otherText = multiSelect
|
|
125
|
+
? getOtherGuidedAnswerText(selectedValues.find(isOtherGuidedAnswer))
|
|
126
|
+
: getOtherGuidedAnswerText(value);
|
|
127
|
+
const isSelected = (optionValue) => multiSelect ? selectedValues.includes(optionValue) : value === optionValue;
|
|
128
|
+
const toggleOption = (optionValue) => {
|
|
129
|
+
if (!multiSelect) {
|
|
130
|
+
onChange(optionValue);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
const next = selectedValues.includes(optionValue)
|
|
134
|
+
? selectedValues.filter((item) => item !== optionValue)
|
|
135
|
+
: [...selectedValues, optionValue];
|
|
136
|
+
onChange(next);
|
|
137
|
+
};
|
|
138
|
+
const toggleOther = () => {
|
|
139
|
+
if (!multiSelect) {
|
|
140
|
+
onChange(otherSelected ? "" : makeOtherGuidedAnswer());
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (otherSelected) {
|
|
144
|
+
onChange(selectedValues.filter((item) => !isOtherGuidedAnswer(item)));
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
onChange([...selectedValues, makeOtherGuidedAnswer()]);
|
|
148
|
+
};
|
|
149
|
+
const setOtherText = (text) => {
|
|
150
|
+
const nextOther = makeOtherGuidedAnswer(text);
|
|
151
|
+
if (!multiSelect) {
|
|
152
|
+
onChange(nextOther);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
onChange([
|
|
156
|
+
...selectedValues.filter((item) => !isOtherGuidedAnswer(item)),
|
|
157
|
+
nextOther,
|
|
158
|
+
]);
|
|
159
|
+
};
|
|
160
|
+
const allowOther = question.allowOther !== false;
|
|
161
|
+
return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "grid gap-2 sm:grid-cols-2", children: [options.map((option) => (_jsx(OptionButton, { option: option, selected: isSelected(option.value), multiSelect: multiSelect, onClick: () => toggleOption(option.value) }, `${option.value}:${option.label}`))), allowOther && (_jsx(OptionButton, { option: {
|
|
162
|
+
label: "Other...",
|
|
163
|
+
value: "__other__",
|
|
164
|
+
description: "Tell the agent exactly what you mean.",
|
|
165
|
+
}, selected: otherSelected, multiSelect: multiSelect, onClick: toggleOther }))] }), allowOther && otherSelected && (_jsx("textarea", { autoFocus: true, value: otherText, onChange: (event) => setOtherText(event.target.value), placeholder: question.placeholder ?? "Type a custom answer...", className: "min-h-[72px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary" }))] }));
|
|
166
|
+
}
|
|
167
|
+
function OptionButton({ option, selected, multiSelect, onClick, }) {
|
|
168
|
+
return (_jsxs("button", { type: "button", onClick: onClick, className: cn("group flex min-h-[56px] cursor-pointer items-start gap-2 rounded-md border px-3 py-2 text-left transition-colors", selected
|
|
169
|
+
? "border-primary bg-primary/10 text-primary"
|
|
170
|
+
: "border-border bg-muted/30 text-muted-foreground hover:border-muted-foreground/50 hover:bg-muted/45 hover:text-foreground"), children: [multiSelect && (_jsx("span", { className: cn("mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border", selected ? "border-primary bg-primary text-primary-foreground" : ""), children: selected && _jsx(IconCheck, { className: "h-3 w-3" }) })), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsxs("span", { className: "flex flex-wrap items-center gap-1.5 text-sm font-medium leading-5", children: [option.label, option.recommended && (_jsx("span", { className: "rounded-sm bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium uppercase text-primary", children: "Recommended" }))] }), option.description && (_jsx("span", { className: "mt-0.5 block text-xs leading-4 text-muted-foreground", children: option.description }))] })] }));
|
|
171
|
+
}
|
|
172
|
+
function ColorOptions({ question, value, onChange, }) {
|
|
173
|
+
const options = question.options ?? question.choices ?? [];
|
|
174
|
+
const multiSelect = question.multiSelect === true;
|
|
175
|
+
const selectedValues = Array.isArray(value) ? value : [];
|
|
176
|
+
const isSelected = (optionValue) => multiSelect ? selectedValues.includes(optionValue) : value === optionValue;
|
|
177
|
+
const toggleOption = (optionValue) => {
|
|
178
|
+
if (!multiSelect) {
|
|
179
|
+
onChange(optionValue);
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
onChange(selectedValues.includes(optionValue)
|
|
183
|
+
? selectedValues.filter((item) => item !== optionValue)
|
|
184
|
+
: [...selectedValues, optionValue]);
|
|
185
|
+
};
|
|
186
|
+
return (_jsx("div", { className: "flex flex-wrap gap-3", children: options.map((option) => {
|
|
187
|
+
const selected = isSelected(option.value);
|
|
188
|
+
return (_jsxs("button", { type: "button", onClick: () => toggleOption(option.value), className: "group flex cursor-pointer flex-col items-center gap-1.5", children: [_jsx("span", { className: cn("h-10 w-10 rounded-full", selected
|
|
189
|
+
? "ring-2 ring-primary ring-offset-2 ring-offset-background"
|
|
190
|
+
: "ring-1 ring-border group-hover:ring-muted-foreground/50"), style: { backgroundColor: option.color || option.value } }), _jsx("span", { className: cn("max-w-20 truncate text-[10px]", selected ? "text-foreground" : "text-muted-foreground"), children: option.label })] }, `${option.value}:${option.label}`));
|
|
191
|
+
}) }));
|
|
192
|
+
}
|
|
193
|
+
function SliderQuestion({ question, value, onChange, }) {
|
|
194
|
+
const min = question.min ?? 0;
|
|
195
|
+
const max = question.max ?? 100;
|
|
196
|
+
const step = question.step ?? 1;
|
|
197
|
+
const current = typeof value === "number" ? value : Math.round((min + max) / 2);
|
|
198
|
+
return (_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("span", { className: "w-8 text-xs text-muted-foreground", children: min }), _jsx("input", { type: "range", min: min, max: max, step: step, value: current, onChange: (event) => onChange(Number(event.target.value)), className: "h-2 flex-1 cursor-pointer accent-primary" }), _jsx("span", { className: "w-8 text-right text-xs text-muted-foreground", children: max }), _jsx("span", { className: "min-w-10 text-right text-sm font-medium tabular-nums text-foreground", children: current })] }));
|
|
199
|
+
}
|
|
200
|
+
function FileDropZone({ value, onChange, }) {
|
|
201
|
+
const [dragOver, setDragOver] = useState(false);
|
|
202
|
+
const files = Array.isArray(value) ? value : [];
|
|
203
|
+
const addFiles = (incoming) => onChange([...files, ...incoming]);
|
|
204
|
+
const removeFile = (index) => onChange(files.filter((_, fileIndex) => fileIndex !== index));
|
|
205
|
+
return (_jsxs("div", { children: [_jsxs("div", { onDragOver: (event) => {
|
|
206
|
+
event.preventDefault();
|
|
207
|
+
setDragOver(true);
|
|
208
|
+
}, onDragLeave: () => setDragOver(false), onDrop: (event) => {
|
|
209
|
+
event.preventDefault();
|
|
210
|
+
setDragOver(false);
|
|
211
|
+
addFiles(Array.from(event.dataTransfer.files));
|
|
212
|
+
}, className: cn("flex cursor-pointer flex-col items-center justify-center rounded-md border-2 border-dashed p-5 transition-colors", dragOver
|
|
213
|
+
? "border-primary bg-primary/5"
|
|
214
|
+
: "border-border bg-muted/30 hover:border-muted-foreground/50"), children: [_jsx(IconUpload, { className: "mb-2 h-5 w-5 text-muted-foreground" }), _jsxs("p", { className: "text-sm text-muted-foreground", children: ["Drag files here or", " ", _jsxs("label", { className: "cursor-pointer text-primary hover:underline", children: ["browse", _jsx("input", { type: "file", multiple: true, onChange: (event) => {
|
|
215
|
+
if (event.target.files)
|
|
216
|
+
addFiles(Array.from(event.target.files));
|
|
217
|
+
event.currentTarget.value = "";
|
|
218
|
+
}, className: "hidden" })] })] })] }), files.length > 0 && (_jsx("div", { className: "mt-2 space-y-1", children: files.map((file, index) => (_jsxs("div", { className: "flex items-center gap-2 rounded-md bg-muted/50 px-2 py-1 text-xs text-muted-foreground", children: [_jsx(IconCheck, { className: "h-3 w-3 text-primary" }), _jsx("span", { className: "min-w-0 flex-1 truncate", children: file.name }), _jsx("button", { type: "button", onClick: () => removeFile(index), className: "cursor-pointer text-muted-foreground/70 hover:text-foreground", "aria-label": `Remove ${file.name}`, children: _jsx(IconX, { className: "h-3 w-3" }) })] }, `${file.name}:${index}`))) }))] }));
|
|
219
|
+
}
|
|
220
|
+
export function useGuidedQuestionFlow({ stateKey = "show-questions", queryKey = ["show-questions"], refetchInterval = 2_000, submitMessage = "Here are my answers — go ahead.", skipMessage = "Skip the questions — decide for me.", buildSubmitContext, buildSkipContext, } = {}) {
|
|
221
|
+
const queryClient = useQueryClient();
|
|
222
|
+
const [payload, setPayload] = useState(null);
|
|
223
|
+
const endpoint = agentNativePath(`/_agent-native/application-state/${stateKey}`);
|
|
224
|
+
const { data } = useQuery({
|
|
225
|
+
queryKey,
|
|
226
|
+
queryFn: async () => {
|
|
227
|
+
const res = await fetch(endpoint);
|
|
228
|
+
if (!res.ok)
|
|
229
|
+
return null;
|
|
230
|
+
const text = await res.text();
|
|
231
|
+
if (!text)
|
|
232
|
+
return null;
|
|
233
|
+
try {
|
|
234
|
+
const parsed = JSON.parse(text);
|
|
235
|
+
if (Array.isArray(parsed?.questions) && parsed.questions.length > 0) {
|
|
236
|
+
return { ...parsed, _ts: Date.now() };
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return null;
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
},
|
|
244
|
+
refetchInterval,
|
|
245
|
+
structuralSharing: false,
|
|
246
|
+
});
|
|
247
|
+
useEffect(() => {
|
|
248
|
+
if (Array.isArray(data?.questions) && data.questions.length > 0) {
|
|
249
|
+
setPayload(data);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
setPayload(null);
|
|
253
|
+
}
|
|
254
|
+
}, [data]);
|
|
255
|
+
const clear = useCallback(() => {
|
|
256
|
+
setPayload(null);
|
|
257
|
+
queryClient.setQueryData(queryKey, null);
|
|
258
|
+
fetch(endpoint, {
|
|
259
|
+
method: "DELETE",
|
|
260
|
+
headers: { "X-Agent-Native-CSRF": "1" },
|
|
261
|
+
}).catch(() => { });
|
|
262
|
+
}, [endpoint, queryClient, queryKey]);
|
|
263
|
+
const handleSubmit = useCallback((answers) => {
|
|
264
|
+
const formattedAnswers = formatGuidedAnswersForAgent(answers);
|
|
265
|
+
const context = buildSubmitContext?.({ answers, formattedAnswers }) ??
|
|
266
|
+
[
|
|
267
|
+
"The user answered the pre-generation questions.",
|
|
268
|
+
"",
|
|
269
|
+
"Answers:",
|
|
270
|
+
formattedAnswers,
|
|
271
|
+
].join("\n");
|
|
272
|
+
sendToAgentChat({ message: submitMessage, context, submit: true });
|
|
273
|
+
clear();
|
|
274
|
+
}, [buildSubmitContext, clear, submitMessage]);
|
|
275
|
+
const handleSkip = useCallback(() => {
|
|
276
|
+
sendToAgentChat({
|
|
277
|
+
message: skipMessage,
|
|
278
|
+
context: buildSkipContext?.(),
|
|
279
|
+
submit: true,
|
|
280
|
+
});
|
|
281
|
+
clear();
|
|
282
|
+
}, [buildSkipContext, clear, skipMessage]);
|
|
283
|
+
return {
|
|
284
|
+
payload,
|
|
285
|
+
questions: payload?.questions ?? null,
|
|
286
|
+
title: payload?.title,
|
|
287
|
+
description: payload?.description,
|
|
288
|
+
skipLabel: payload?.skipLabel,
|
|
289
|
+
submitLabel: payload?.submitLabel,
|
|
290
|
+
clear,
|
|
291
|
+
handleSubmit,
|
|
292
|
+
handleSkip,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=guided-questions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guided-questions.js","sourceRoot":"","sources":["../../src/client/guided-questions.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n IconCheck,\n IconChevronRight,\n IconHelpCircle,\n IconUpload,\n IconX,\n} from \"@tabler/icons-react\";\nimport { agentNativePath } from \"./api-path.js\";\nimport { sendToAgentChat } from \"./agent-chat.js\";\nimport { cn } from \"./utils.js\";\n\nexport type GuidedQuestionType =\n | \"text-options\"\n | \"color-options\"\n | \"slider\"\n | \"file\"\n | \"freeform\";\n\nexport interface GuidedQuestionOption {\n label: string;\n value: string;\n color?: string;\n icon?: string;\n description?: string;\n recommended?: boolean;\n}\n\nexport interface GuidedQuestion {\n id: string;\n type: GuidedQuestionType;\n header?: string;\n question: string;\n description?: string;\n options?: GuidedQuestionOption[];\n choices?: GuidedQuestionOption[];\n multiSelect?: boolean;\n min?: number;\n max?: number;\n step?: number;\n required?: boolean;\n placeholder?: string;\n allowOther?: boolean;\n includeExplore?: boolean;\n includeDecide?: boolean;\n}\n\nexport type GuidedQuestionAnswers = Record<string, unknown>;\n\nexport interface GuidedQuestionPayload {\n questions: GuidedQuestion[];\n title?: string;\n description?: string;\n skipLabel?: string;\n submitLabel?: string;\n}\n\nconst OTHER_OPTION_PREFIX = \"__other__:\";\nconst EXPLORE_OPTION: GuidedQuestionOption = {\n label: \"Explore a few options\",\n value: \"__explore__\",\n description: \"Show me a few distinct directions before committing.\",\n};\nconst DECIDE_OPTION: GuidedQuestionOption = {\n label: \"Decide for me\",\n value: \"__decide__\",\n description: \"Use your judgment and keep moving.\",\n};\n\nfunction isFileLike(value: unknown): value is { name: string } {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"name\" in value &&\n typeof (value as { name?: unknown }).name === \"string\"\n );\n}\n\nexport function isOtherGuidedAnswer(value: unknown): value is string {\n return typeof value === \"string\" && value.startsWith(OTHER_OPTION_PREFIX);\n}\n\nexport function getOtherGuidedAnswerText(value: unknown): string {\n return isOtherGuidedAnswer(value)\n ? value.slice(OTHER_OPTION_PREFIX.length)\n : \"\";\n}\n\nexport function makeOtherGuidedAnswer(text = \"\"): string {\n return `${OTHER_OPTION_PREFIX}${text}`;\n}\n\nexport function hasGuidedAnswer(value: unknown): boolean {\n if (value == null || value === \"\") return false;\n if (Array.isArray(value)) return value.some(hasGuidedAnswer);\n if (isOtherGuidedAnswer(value)) {\n return getOtherGuidedAnswerText(value).trim().length > 0;\n }\n return true;\n}\n\nexport function formatGuidedAnswerValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(formatGuidedAnswerValue).filter(hasGuidedAnswer);\n }\n if (isOtherGuidedAnswer(value)) {\n const text = getOtherGuidedAnswerText(value).trim();\n return text ? `Other: ${text}` : \"\";\n }\n if (isFileLike(value)) return value.name;\n return value;\n}\n\nexport function normalizeGuidedAnswers(\n answers: GuidedQuestionAnswers,\n): GuidedQuestionAnswers {\n return Object.fromEntries(\n Object.entries(answers).map(([id, value]) => [\n id,\n formatGuidedAnswerValue(value),\n ]),\n );\n}\n\nexport function formatGuidedAnswersForAgent(\n answers: GuidedQuestionAnswers,\n): string {\n return Object.entries(normalizeGuidedAnswers(answers))\n .filter(([, value]) => hasGuidedAnswer(value))\n .map(([id, value]) => {\n if (Array.isArray(value)) return `${id}: ${value.join(\", \")}`;\n return `${id}: ${String(value)}`;\n })\n .join(\"\\n\");\n}\n\nfunction optionKey(option: GuidedQuestionOption): string {\n return `${option.value.toLowerCase()}::${option.label.toLowerCase()}`;\n}\n\nfunction withDefaultOptions(question: GuidedQuestion): GuidedQuestionOption[] {\n const base = question.options ?? question.choices ?? [];\n const seen = new Set(base.map(optionKey));\n const result = [...base];\n const maybePush = (option: GuidedQuestionOption, enabled: boolean) => {\n if (!enabled) return;\n const key = optionKey(option);\n const label = option.label.toLowerCase();\n const value = option.value.toLowerCase();\n const duplicate = result.some(\n (existing) =>\n optionKey(existing) === key ||\n existing.label.toLowerCase() === label ||\n existing.value.toLowerCase() === value,\n );\n if (duplicate || seen.has(key)) return;\n seen.add(key);\n result.push(option);\n };\n maybePush(EXPLORE_OPTION, question.includeExplore !== false);\n maybePush(DECIDE_OPTION, question.includeDecide !== false);\n return result;\n}\n\nexport interface GuidedQuestionFlowProps {\n questions: GuidedQuestion[];\n onSubmit: (answers: GuidedQuestionAnswers) => void;\n onSkip: () => void;\n title?: string;\n description?: string;\n skipLabel?: string;\n submitLabel?: string;\n className?: string;\n}\n\nexport function GuidedQuestionFlow({\n questions,\n onSubmit,\n onSkip,\n title = \"A few choices before I generate\",\n description = \"Pick what you know. Use Other for anything that does not fit, or let the agent decide.\",\n skipLabel = \"Skip\",\n submitLabel = \"Continue\",\n className,\n}: GuidedQuestionFlowProps) {\n const [answers, setAnswers] = useState<GuidedQuestionAnswers>({});\n\n useEffect(() => {\n setAnswers({});\n }, [questions]);\n\n const setAnswer = useCallback((id: string, value: unknown) => {\n setAnswers((prev) => ({ ...prev, [id]: value }));\n }, []);\n\n const allRequiredAnswered = questions\n .filter((question) => question.required)\n .every((question) => hasGuidedAnswer(answers[question.id]));\n\n return (\n <div\n className={cn(\n \"flex h-full w-full items-center justify-center bg-background text-foreground\",\n className,\n )}\n >\n <div className=\"flex max-h-full w-full max-w-3xl flex-col px-4 py-6 sm:px-8 sm:py-10\">\n <div className=\"mb-6 flex items-start gap-3\">\n <div className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-md border border-border bg-muted/40 text-primary\">\n <IconHelpCircle className=\"h-5 w-5\" />\n </div>\n <div className=\"min-w-0\">\n <h2 className=\"text-xl font-semibold tracking-normal text-foreground sm:text-2xl\">\n {title}\n </h2>\n {description && (\n <p className=\"mt-1 max-w-2xl text-sm leading-5 text-muted-foreground\">\n {description}\n </p>\n )}\n </div>\n </div>\n\n <div className=\"min-h-0 flex-1 space-y-4 overflow-y-auto pr-1\">\n {questions.map((question, index) => (\n <QuestionCard\n key={question.id}\n index={index}\n question={question}\n value={answers[question.id]}\n onChange={(value) => setAnswer(question.id, value)}\n />\n ))}\n </div>\n\n <div className=\"mt-5 flex shrink-0 items-center justify-between gap-4 border-t border-border pt-4\">\n <div className=\"flex items-center gap-1.5\">\n {questions.map((question, index) => (\n <span\n key={question.id || index}\n className={cn(\n \"h-1.5 w-1.5 rounded-full\",\n hasGuidedAnswer(answers[question.id])\n ? \"bg-primary\"\n : \"bg-muted-foreground/30\",\n )}\n />\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n onClick={onSkip}\n className=\"cursor-pointer rounded-md px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-muted/60 hover:text-foreground\"\n >\n {skipLabel}\n </button>\n <button\n type=\"button\"\n onClick={() => onSubmit(normalizeGuidedAnswers(answers))}\n disabled={!allRequiredAnswered}\n className=\"inline-flex cursor-pointer items-center gap-2 rounded-md bg-primary px-3.5 py-2 text-sm font-medium text-primary-foreground transition-colors hover:bg-primary/90 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n {submitLabel}\n <IconChevronRight className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction QuestionCard({\n index,\n question,\n value,\n onChange,\n}: {\n index: number;\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n return (\n <section className=\"rounded-lg border border-border bg-card/65 p-4 shadow-sm\">\n <div className=\"mb-3 flex gap-3\">\n <div className=\"flex h-6 min-w-6 items-center justify-center rounded-md bg-muted text-xs font-medium text-muted-foreground\">\n {index + 1}\n </div>\n <div className=\"min-w-0\">\n {question.header && (\n <p className=\"mb-1 text-[11px] font-medium uppercase text-muted-foreground\">\n {question.header}\n </p>\n )}\n <h3 className=\"text-sm font-medium leading-5 text-foreground\">\n {question.question}\n {question.required && (\n <span className=\"ml-1 text-destructive\">*</span>\n )}\n </h3>\n {question.description && (\n <p className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {question.description}\n </p>\n )}\n </div>\n </div>\n\n {question.type === \"text-options\" && (\n <TextOptions question={question} value={value} onChange={onChange} />\n )}\n {question.type === \"color-options\" && (\n <ColorOptions question={question} value={value} onChange={onChange} />\n )}\n {question.type === \"slider\" && (\n <SliderQuestion question={question} value={value} onChange={onChange} />\n )}\n {question.type === \"file\" && (\n <FileDropZone value={value} onChange={onChange} />\n )}\n {question.type === \"freeform\" && (\n <textarea\n value={typeof value === \"string\" ? value : \"\"}\n onChange={(event) => onChange(event.target.value)}\n placeholder={question.placeholder ?? \"Type your answer...\"}\n className=\"min-h-[84px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary\"\n />\n )}\n </section>\n );\n}\n\nfunction TextOptions({\n question,\n value,\n onChange,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const options = useMemo(() => withDefaultOptions(question), [question]);\n const multiSelect = question.multiSelect === true;\n const selectedValues = Array.isArray(value) ? value : [];\n const otherSelected = multiSelect\n ? selectedValues.some(isOtherGuidedAnswer)\n : isOtherGuidedAnswer(value);\n const otherText = multiSelect\n ? getOtherGuidedAnswerText(selectedValues.find(isOtherGuidedAnswer))\n : getOtherGuidedAnswerText(value);\n\n const isSelected = (optionValue: string) =>\n multiSelect ? selectedValues.includes(optionValue) : value === optionValue;\n\n const toggleOption = (optionValue: string) => {\n if (!multiSelect) {\n onChange(optionValue);\n return;\n }\n const next = selectedValues.includes(optionValue)\n ? selectedValues.filter((item) => item !== optionValue)\n : [...selectedValues, optionValue];\n onChange(next);\n };\n\n const toggleOther = () => {\n if (!multiSelect) {\n onChange(otherSelected ? \"\" : makeOtherGuidedAnswer());\n return;\n }\n if (otherSelected) {\n onChange(selectedValues.filter((item) => !isOtherGuidedAnswer(item)));\n return;\n }\n onChange([...selectedValues, makeOtherGuidedAnswer()]);\n };\n\n const setOtherText = (text: string) => {\n const nextOther = makeOtherGuidedAnswer(text);\n if (!multiSelect) {\n onChange(nextOther);\n return;\n }\n onChange([\n ...selectedValues.filter((item) => !isOtherGuidedAnswer(item)),\n nextOther,\n ]);\n };\n\n const allowOther = question.allowOther !== false;\n\n return (\n <div className=\"space-y-3\">\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {options.map((option) => (\n <OptionButton\n key={`${option.value}:${option.label}`}\n option={option}\n selected={isSelected(option.value)}\n multiSelect={multiSelect}\n onClick={() => toggleOption(option.value)}\n />\n ))}\n {allowOther && (\n <OptionButton\n option={{\n label: \"Other...\",\n value: \"__other__\",\n description: \"Tell the agent exactly what you mean.\",\n }}\n selected={otherSelected}\n multiSelect={multiSelect}\n onClick={toggleOther}\n />\n )}\n </div>\n {allowOther && otherSelected && (\n <textarea\n autoFocus\n value={otherText}\n onChange={(event) => setOtherText(event.target.value)}\n placeholder={question.placeholder ?? \"Type a custom answer...\"}\n className=\"min-h-[72px] w-full resize-none rounded-md border border-border bg-muted/45 px-3 py-2 text-sm text-foreground outline-none placeholder:text-muted-foreground/70 focus:border-primary\"\n />\n )}\n </div>\n );\n}\n\nfunction OptionButton({\n option,\n selected,\n multiSelect,\n onClick,\n}: {\n option: GuidedQuestionOption;\n selected: boolean;\n multiSelect?: boolean;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className={cn(\n \"group flex min-h-[56px] cursor-pointer items-start gap-2 rounded-md border px-3 py-2 text-left transition-colors\",\n selected\n ? \"border-primary bg-primary/10 text-primary\"\n : \"border-border bg-muted/30 text-muted-foreground hover:border-muted-foreground/50 hover:bg-muted/45 hover:text-foreground\",\n )}\n >\n {multiSelect && (\n <span\n className={cn(\n \"mt-0.5 flex h-4 w-4 shrink-0 items-center justify-center rounded border\",\n selected ? \"border-primary bg-primary text-primary-foreground\" : \"\",\n )}\n >\n {selected && <IconCheck className=\"h-3 w-3\" />}\n </span>\n )}\n <span className=\"min-w-0 flex-1\">\n <span className=\"flex flex-wrap items-center gap-1.5 text-sm font-medium leading-5\">\n {option.label}\n {option.recommended && (\n <span className=\"rounded-sm bg-primary/15 px-1.5 py-0.5 text-[10px] font-medium uppercase text-primary\">\n Recommended\n </span>\n )}\n </span>\n {option.description && (\n <span className=\"mt-0.5 block text-xs leading-4 text-muted-foreground\">\n {option.description}\n </span>\n )}\n </span>\n </button>\n );\n}\n\nfunction ColorOptions({\n question,\n value,\n onChange,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const options = question.options ?? question.choices ?? [];\n const multiSelect = question.multiSelect === true;\n const selectedValues = Array.isArray(value) ? value : [];\n const isSelected = (optionValue: string) =>\n multiSelect ? selectedValues.includes(optionValue) : value === optionValue;\n\n const toggleOption = (optionValue: string) => {\n if (!multiSelect) {\n onChange(optionValue);\n return;\n }\n onChange(\n selectedValues.includes(optionValue)\n ? selectedValues.filter((item) => item !== optionValue)\n : [...selectedValues, optionValue],\n );\n };\n\n return (\n <div className=\"flex flex-wrap gap-3\">\n {options.map((option) => {\n const selected = isSelected(option.value);\n return (\n <button\n type=\"button\"\n key={`${option.value}:${option.label}`}\n onClick={() => toggleOption(option.value)}\n className=\"group flex cursor-pointer flex-col items-center gap-1.5\"\n >\n <span\n className={cn(\n \"h-10 w-10 rounded-full\",\n selected\n ? \"ring-2 ring-primary ring-offset-2 ring-offset-background\"\n : \"ring-1 ring-border group-hover:ring-muted-foreground/50\",\n )}\n style={{ backgroundColor: option.color || option.value }}\n />\n <span\n className={cn(\n \"max-w-20 truncate text-[10px]\",\n selected ? \"text-foreground\" : \"text-muted-foreground\",\n )}\n >\n {option.label}\n </span>\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction SliderQuestion({\n question,\n value,\n onChange,\n}: {\n question: GuidedQuestion;\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const min = question.min ?? 0;\n const max = question.max ?? 100;\n const step = question.step ?? 1;\n const current =\n typeof value === \"number\" ? value : Math.round((min + max) / 2);\n\n return (\n <div className=\"flex items-center gap-4\">\n <span className=\"w-8 text-xs text-muted-foreground\">{min}</span>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={current}\n onChange={(event) => onChange(Number(event.target.value))}\n className=\"h-2 flex-1 cursor-pointer accent-primary\"\n />\n <span className=\"w-8 text-right text-xs text-muted-foreground\">\n {max}\n </span>\n <span className=\"min-w-10 text-right text-sm font-medium tabular-nums text-foreground\">\n {current}\n </span>\n </div>\n );\n}\n\nfunction FileDropZone({\n value,\n onChange,\n}: {\n value: unknown;\n onChange: (value: unknown) => void;\n}) {\n const [dragOver, setDragOver] = useState(false);\n const files: File[] = Array.isArray(value) ? (value as File[]) : [];\n\n const addFiles = (incoming: File[]) => onChange([...files, ...incoming]);\n const removeFile = (index: number) =>\n onChange(files.filter((_, fileIndex) => fileIndex !== index));\n\n return (\n <div>\n <div\n onDragOver={(event) => {\n event.preventDefault();\n setDragOver(true);\n }}\n onDragLeave={() => setDragOver(false)}\n onDrop={(event) => {\n event.preventDefault();\n setDragOver(false);\n addFiles(Array.from(event.dataTransfer.files));\n }}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center rounded-md border-2 border-dashed p-5 transition-colors\",\n dragOver\n ? \"border-primary bg-primary/5\"\n : \"border-border bg-muted/30 hover:border-muted-foreground/50\",\n )}\n >\n <IconUpload className=\"mb-2 h-5 w-5 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">\n Drag files here or{\" \"}\n <label className=\"cursor-pointer text-primary hover:underline\">\n browse\n <input\n type=\"file\"\n multiple\n onChange={(event) => {\n if (event.target.files)\n addFiles(Array.from(event.target.files));\n event.currentTarget.value = \"\";\n }}\n className=\"hidden\"\n />\n </label>\n </p>\n </div>\n\n {files.length > 0 && (\n <div className=\"mt-2 space-y-1\">\n {files.map((file, index) => (\n <div\n key={`${file.name}:${index}`}\n className=\"flex items-center gap-2 rounded-md bg-muted/50 px-2 py-1 text-xs text-muted-foreground\"\n >\n <IconCheck className=\"h-3 w-3 text-primary\" />\n <span className=\"min-w-0 flex-1 truncate\">{file.name}</span>\n <button\n type=\"button\"\n onClick={() => removeFile(index)}\n className=\"cursor-pointer text-muted-foreground/70 hover:text-foreground\"\n aria-label={`Remove ${file.name}`}\n >\n <IconX className=\"h-3 w-3\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport interface UseGuidedQuestionFlowOptions {\n stateKey?: string;\n queryKey?: readonly unknown[];\n refetchInterval?: number | false;\n submitMessage?: string;\n skipMessage?: string;\n buildSubmitContext?: (args: {\n answers: GuidedQuestionAnswers;\n formattedAnswers: string;\n }) => string;\n buildSkipContext?: () => string;\n}\n\nexport function useGuidedQuestionFlow({\n stateKey = \"show-questions\",\n queryKey = [\"show-questions\"],\n refetchInterval = 2_000,\n submitMessage = \"Here are my answers — go ahead.\",\n skipMessage = \"Skip the questions — decide for me.\",\n buildSubmitContext,\n buildSkipContext,\n}: UseGuidedQuestionFlowOptions = {}) {\n const queryClient = useQueryClient();\n const [payload, setPayload] = useState<GuidedQuestionPayload | null>(null);\n const endpoint = agentNativePath(\n `/_agent-native/application-state/${stateKey}`,\n );\n\n const { data } = useQuery({\n queryKey,\n queryFn: async () => {\n const res = await fetch(endpoint);\n if (!res.ok) return null;\n const text = await res.text();\n if (!text) return null;\n try {\n const parsed = JSON.parse(text);\n if (Array.isArray(parsed?.questions) && parsed.questions.length > 0) {\n return { ...parsed, _ts: Date.now() } as GuidedQuestionPayload & {\n _ts: number;\n };\n }\n } catch {\n return null;\n }\n return null;\n },\n refetchInterval,\n structuralSharing: false,\n });\n\n useEffect(() => {\n if (Array.isArray(data?.questions) && data.questions.length > 0) {\n setPayload(data);\n } else {\n setPayload(null);\n }\n }, [data]);\n\n const clear = useCallback(() => {\n setPayload(null);\n queryClient.setQueryData(queryKey, null);\n fetch(endpoint, {\n method: \"DELETE\",\n headers: { \"X-Agent-Native-CSRF\": \"1\" },\n }).catch(() => {});\n }, [endpoint, queryClient, queryKey]);\n\n const handleSubmit = useCallback(\n (answers: GuidedQuestionAnswers) => {\n const formattedAnswers = formatGuidedAnswersForAgent(answers);\n const context =\n buildSubmitContext?.({ answers, formattedAnswers }) ??\n [\n \"The user answered the pre-generation questions.\",\n \"\",\n \"Answers:\",\n formattedAnswers,\n ].join(\"\\n\");\n sendToAgentChat({ message: submitMessage, context, submit: true });\n clear();\n },\n [buildSubmitContext, clear, submitMessage],\n );\n\n const handleSkip = useCallback(() => {\n sendToAgentChat({\n message: skipMessage,\n context: buildSkipContext?.(),\n submit: true,\n });\n clear();\n }, [buildSkipContext, clear, skipMessage]);\n\n return {\n payload,\n questions: payload?.questions ?? null,\n title: payload?.title,\n description: payload?.description,\n skipLabel: payload?.skipLabel,\n submitLabel: payload?.submitLabel,\n clear,\n handleSubmit,\n handleSkip,\n };\n}\n"]}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export { AssistantChat, clearChatStorage, type AssistantChatProps, type Assistan
|
|
|
17
17
|
export { MultiTabAssistantChat, type MultiTabAssistantChatProps, type MultiTabAssistantChatHeaderProps, } from "./MultiTabAssistantChat.js";
|
|
18
18
|
export { createAgentChatAdapter } from "./agent-chat-adapter.js";
|
|
19
19
|
export { PromptComposer, type PromptComposerProps, type PromptComposerFile, type PromptComposerSubmitOptions, } from "./composer/PromptComposer.js";
|
|
20
|
+
export { GuidedQuestionFlow, useGuidedQuestionFlow, formatGuidedAnswerValue, formatGuidedAnswersForAgent, getOtherGuidedAnswerText, hasGuidedAnswer, isOtherGuidedAnswer, makeOtherGuidedAnswer, normalizeGuidedAnswers, type GuidedQuestion, type GuidedQuestionAnswers, type GuidedQuestionFlowProps, type GuidedQuestionOption, type GuidedQuestionPayload, type GuidedQuestionType, type UseGuidedQuestionFlowOptions, } from "./guided-questions.js";
|
|
20
21
|
export { useChatThreads, type ChatThreadSummary, type ChatThreadData, } from "./use-chat-threads.js";
|
|
21
22
|
export { AgentPanel, AgentSidebar, AgentToggleButton, focusAgentChat, type AgentPanelProps, type AgentSidebarProps, } from "./AgentPanel.js";
|
|
22
23
|
export { AgentNativeIcon } from "./components/icons/AgentNativeIcon.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.js
CHANGED
|
@@ -19,6 +19,7 @@ export { AssistantChat, clearChatStorage, } from "./AssistantChat.js";
|
|
|
19
19
|
export { MultiTabAssistantChat, } from "./MultiTabAssistantChat.js";
|
|
20
20
|
export { createAgentChatAdapter } from "./agent-chat-adapter.js";
|
|
21
21
|
export { PromptComposer, } from "./composer/PromptComposer.js";
|
|
22
|
+
export { GuidedQuestionFlow, useGuidedQuestionFlow, formatGuidedAnswerValue, formatGuidedAnswersForAgent, getOtherGuidedAnswerText, hasGuidedAnswer, isOtherGuidedAnswer, makeOtherGuidedAnswer, normalizeGuidedAnswers, } from "./guided-questions.js";
|
|
22
23
|
export { useChatThreads, } from "./use-chat-threads.js";
|
|
23
24
|
export { AgentPanel, AgentSidebar, AgentToggleButton, focusAgentChat, } from "./AgentPanel.js";
|
|
24
25
|
export { AgentNativeIcon } from "./components/icons/AgentNativeIcon.js";
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { installRouteChunkRecovery } from \"./route-chunk-recovery.js\";\n\ninstallRouteChunkRecovery();\n\nexport {\n sendToAgentChat,\n generateTabId,\n type AgentChatMessage,\n} from \"./agent-chat.js\";\nexport { useAgentChatGenerating } from \"./use-agent-chat.js\";\nexport { useDevMode } from \"./use-dev-mode.js\";\nexport {\n agentNativePath,\n appApiPath,\n appBasePath,\n appPath,\n} from \"./api-path.js\";\nexport { useSendToAgentChat } from \"./use-send-to-agent-chat.js\";\nexport {\n useChatModels,\n type UseChatModelsResult,\n type EngineModelGroup,\n} from \"./use-chat-models.js\";\nexport {\n CodeRequiredDialog,\n type CodeRequiredDialogProps,\n} from \"./components/CodeRequiredDialog.js\";\nexport {\n CodeAgentIndicator,\n type CodeAgentIndicatorProps,\n} from \"./components/CodeAgentIndicator.js\";\nexport {\n useDbSync,\n useFileWatcher,\n useScreenRefreshKey,\n} from \"./use-db-sync.js\";\nexport { cn } from \"./utils.js\";\nexport { ApiKeySettings } from \"./components/ApiKeySettings.js\";\nexport { useSession, type AuthSession } from \"./use-session.js\";\nexport {\n sendToFrame,\n onFrameMessage,\n requestUserInfo,\n getFrameOrigin,\n getCallbackOrigin,\n oauthRedirectUri,\n isInFrame,\n enterStyleEditing,\n enterTextEditing,\n exitSelectionMode,\n type UserInfo,\n} from \"./frame.js\";\nexport {\n getBuilderParentOrigin,\n isInBuilderFrame,\n sendToBuilderChat,\n type BuilderChatMessage,\n} from \"./builder-frame.js\";\nexport {\n NewWorkspaceAppFlow,\n type NewWorkspaceAppFlowProps,\n type VaultSecretOption,\n} from \"./NewWorkspaceAppFlow.js\";\nexport {\n AssistantChat,\n clearChatStorage,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nexport {\n MultiTabAssistantChat,\n type MultiTabAssistantChatProps,\n type MultiTabAssistantChatHeaderProps,\n} from \"./MultiTabAssistantChat.js\";\nexport { createAgentChatAdapter } from \"./agent-chat-adapter.js\";\nexport {\n PromptComposer,\n type PromptComposerProps,\n type PromptComposerFile,\n type PromptComposerSubmitOptions,\n} from \"./composer/PromptComposer.js\";\nexport {\n useChatThreads,\n type ChatThreadSummary,\n type ChatThreadData,\n} from \"./use-chat-threads.js\";\nexport {\n AgentPanel,\n AgentSidebar,\n AgentToggleButton,\n focusAgentChat,\n type AgentPanelProps,\n type AgentSidebarProps,\n} from \"./AgentPanel.js\";\nexport { AgentNativeIcon } from \"./components/icons/AgentNativeIcon.js\";\nexport { SettingsPanel, type SettingsPanelProps } from \"./settings/index.js\";\n// Deprecated — use AgentSidebar + AgentToggleButton instead\nexport {\n ProductionAgentPanel,\n type ProductionAgentPanelProps,\n} from \"./ProductionAgentPanel.js\";\nexport {\n useProductionAgent,\n type ProductionAgentMessage,\n type UseProductionAgentOptions,\n type UseProductionAgentResult,\n} from \"./useProductionAgent.js\";\nexport { Turnstile, type TurnstileProps } from \"./Turnstile.js\";\nexport {\n OpenSourceBadge,\n PoweredByBadge,\n type OpenSourceBadgeProps,\n type PoweredByBadgeProps,\n} from \"./PoweredByBadge.js\";\nexport { FeedbackButton, type FeedbackButtonProps } from \"./FeedbackButton.js\";\nexport { ErrorBoundary } from \"./ErrorBoundary.js\";\nexport { installRouteChunkRecovery } from \"./route-chunk-recovery.js\";\nexport { ClientOnly } from \"./ClientOnly.js\";\nexport { DefaultSpinner } from \"./DefaultSpinner.js\";\nexport {\n getThemeInitScript,\n themeInitScript,\n type ThemePreference,\n} from \"./theme.js\";\nexport { AgentTerminal, type AgentTerminalProps } from \"./terminal/index.js\";\nexport {\n trackEvent,\n trackSessionStatus,\n configureTracking,\n setSentryUser,\n captureError,\n captureClientException,\n type ClientCaptureContext,\n} from \"./analytics.js\";\nexport {\n useCollaborativeDoc,\n emailToColor,\n emailToName,\n type UseCollaborativeDocOptions,\n type UseCollaborativeDocResult,\n type CollabUser,\n} from \"../collab/client.js\";\nexport {\n ResourcesPanel,\n ResourceTree,\n ResourceEditor,\n useResources,\n useResourceTree,\n useResource,\n useCreateResource,\n useUpdateResource,\n useDeleteResource,\n useUploadResource,\n type Resource,\n type ResourceMeta,\n type TreeNode,\n type ResourceScope,\n type ResourceTreeProps,\n type ResourceEditorProps,\n} from \"./resources/index.js\";\nexport type {\n AppToFrameMessage,\n FrameToAppMessage,\n FrameMessage,\n CodeCompleteMessage,\n ChatRunningMessage,\n} from \"./frame-protocol.js\";\nexport {\n CommandMenu,\n useCommandMenuShortcut,\n openAgentSidebar,\n submitToAgent,\n type CommandMenuProps,\n type CommandGroupProps,\n type CommandItemProps,\n type CommandShortcutProps,\n} from \"./CommandMenu.js\";\nexport {\n DevOverlay,\n useDevOverlayShortcut,\n registerDevPanel,\n unregisterDevPanel,\n listDevPanels,\n subscribeDevPanels,\n useDevOption,\n clearAllDevOverlayStorage,\n devOptionKey,\n DEV_OVERLAY_STORAGE_PREFIX,\n type DevOverlayProps,\n type DevPanel,\n type DevOption,\n type DevBooleanOption,\n type DevSelectOption,\n type DevStringOption,\n type DevActionOption,\n type DevOptionValue,\n} from \"./dev-overlay/index.js\";\nexport {\n useActionQuery,\n useActionMutation,\n type ActionRegistry,\n} from \"./use-action.js\";\nexport {\n ShareButton,\n ShareDialog,\n VisibilityBadge,\n type ShareButtonProps,\n type ShareDialogProps,\n type VisibilityBadgeProps,\n} from \"./sharing/index.js\";\nexport {\n postNavigate,\n isInAgentEmbed,\n AGENT_NAVIGATE_MESSAGE_TYPE,\n type AgentNavigateMessage,\n} from \"./embed.js\";\nexport { IframeEmbed, parseEmbedBody } from \"./IframeEmbed.js\";\nexport {\n useAvatarUrl,\n uploadAvatar,\n invalidateAvatarCache,\n} from \"./use-avatar.js\";\nexport {\n ObservabilityDashboard,\n ThumbsFeedback,\n} from \"./observability/index.js\";\n// Presence UI components\nexport {\n PresenceBar,\n type PresenceBarProps,\n} from \"./components/PresenceBar.js\";\nexport {\n AgentPresenceChip,\n type AgentPresenceChipProps,\n} from \"./components/AgentPresenceChip.js\";\n// Structured data collaboration hooks\nexport {\n useCollaborativeMap,\n useCollaborativeArray,\n type UseCollaborativeMapOptions,\n type UseCollaborativeMapResult,\n type UseCollaborativeArrayOptions,\n type UseCollaborativeArrayResult,\n} from \"../collab/client-struct.js\";\nexport { NotificationsBell } from \"./notifications/index.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAEtE,yBAAyB,EAAE,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,aAAa,GAEd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,UAAU,EACV,WAAW,EACX,OAAO,GACR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EACL,aAAa,GAGd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,kBAAkB,GAEnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,kBAAkB,GAEnB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,SAAS,EACT,cAAc,EACd,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAChE,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,mBAAmB,GAGpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,aAAa,EACb,gBAAgB,GAGjB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,GAGtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,EACL,cAAc,GAIf,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GAQvB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,cAAc,GAGf,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,GAGf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACxE,OAAO,EAAE,aAAa,EAA2B,MAAM,qBAAqB,CAAC;AAC7E,4DAA4D;AAC5D,OAAO,EACL,oBAAoB,GAErB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,kBAAkB,GAInB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,EACL,eAAe,EACf,cAAc,GAGf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAA4B,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACL,kBAAkB,EAClB,eAAe,GAEhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAA2B,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,sBAAsB,GAEvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,WAAW,GAIZ,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,eAAe,EACf,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,GAOlB,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAKd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EACzB,YAAY,EACZ,0BAA0B,GAS3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,cAAc,EACd,iBAAiB,GAElB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,WAAW,EACX,WAAW,EACX,eAAe,GAIhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,2BAA2B,GAE5B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,qBAAqB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,cAAc,GACf,MAAM,0BAA0B,CAAC;AAClC,yBAAyB;AACzB,OAAO,EACL,WAAW,GAEZ,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,iBAAiB,GAElB,MAAM,mCAAmC,CAAC;AAC3C,sCAAsC;AACtC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,GAKtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC","sourcesContent":["import { installRouteChunkRecovery } from \"./route-chunk-recovery.js\";\n\ninstallRouteChunkRecovery();\n\nexport {\n sendToAgentChat,\n generateTabId,\n type AgentChatMessage,\n} from \"./agent-chat.js\";\nexport { useAgentChatGenerating } from \"./use-agent-chat.js\";\nexport { useDevMode } from \"./use-dev-mode.js\";\nexport {\n agentNativePath,\n appApiPath,\n appBasePath,\n appPath,\n} from \"./api-path.js\";\nexport { useSendToAgentChat } from \"./use-send-to-agent-chat.js\";\nexport {\n useChatModels,\n type UseChatModelsResult,\n type EngineModelGroup,\n} from \"./use-chat-models.js\";\nexport {\n CodeRequiredDialog,\n type CodeRequiredDialogProps,\n} from \"./components/CodeRequiredDialog.js\";\nexport {\n CodeAgentIndicator,\n type CodeAgentIndicatorProps,\n} from \"./components/CodeAgentIndicator.js\";\nexport {\n useDbSync,\n useFileWatcher,\n useScreenRefreshKey,\n} from \"./use-db-sync.js\";\nexport { cn } from \"./utils.js\";\nexport { ApiKeySettings } from \"./components/ApiKeySettings.js\";\nexport { useSession, type AuthSession } from \"./use-session.js\";\nexport {\n sendToFrame,\n onFrameMessage,\n requestUserInfo,\n getFrameOrigin,\n getCallbackOrigin,\n oauthRedirectUri,\n isInFrame,\n enterStyleEditing,\n enterTextEditing,\n exitSelectionMode,\n type UserInfo,\n} from \"./frame.js\";\nexport {\n getBuilderParentOrigin,\n isInBuilderFrame,\n sendToBuilderChat,\n type BuilderChatMessage,\n} from \"./builder-frame.js\";\nexport {\n NewWorkspaceAppFlow,\n type NewWorkspaceAppFlowProps,\n type VaultSecretOption,\n} from \"./NewWorkspaceAppFlow.js\";\nexport {\n AssistantChat,\n clearChatStorage,\n type AssistantChatProps,\n type AssistantChatHandle,\n} from \"./AssistantChat.js\";\nexport {\n MultiTabAssistantChat,\n type MultiTabAssistantChatProps,\n type MultiTabAssistantChatHeaderProps,\n} from \"./MultiTabAssistantChat.js\";\nexport { createAgentChatAdapter } from \"./agent-chat-adapter.js\";\nexport {\n PromptComposer,\n type PromptComposerProps,\n type PromptComposerFile,\n type PromptComposerSubmitOptions,\n} from \"./composer/PromptComposer.js\";\nexport {\n GuidedQuestionFlow,\n useGuidedQuestionFlow,\n formatGuidedAnswerValue,\n formatGuidedAnswersForAgent,\n getOtherGuidedAnswerText,\n hasGuidedAnswer,\n isOtherGuidedAnswer,\n makeOtherGuidedAnswer,\n normalizeGuidedAnswers,\n type GuidedQuestion,\n type GuidedQuestionAnswers,\n type GuidedQuestionFlowProps,\n type GuidedQuestionOption,\n type GuidedQuestionPayload,\n type GuidedQuestionType,\n type UseGuidedQuestionFlowOptions,\n} from \"./guided-questions.js\";\nexport {\n useChatThreads,\n type ChatThreadSummary,\n type ChatThreadData,\n} from \"./use-chat-threads.js\";\nexport {\n AgentPanel,\n AgentSidebar,\n AgentToggleButton,\n focusAgentChat,\n type AgentPanelProps,\n type AgentSidebarProps,\n} from \"./AgentPanel.js\";\nexport { AgentNativeIcon } from \"./components/icons/AgentNativeIcon.js\";\nexport { SettingsPanel, type SettingsPanelProps } from \"./settings/index.js\";\n// Deprecated — use AgentSidebar + AgentToggleButton instead\nexport {\n ProductionAgentPanel,\n type ProductionAgentPanelProps,\n} from \"./ProductionAgentPanel.js\";\nexport {\n useProductionAgent,\n type ProductionAgentMessage,\n type UseProductionAgentOptions,\n type UseProductionAgentResult,\n} from \"./useProductionAgent.js\";\nexport { Turnstile, type TurnstileProps } from \"./Turnstile.js\";\nexport {\n OpenSourceBadge,\n PoweredByBadge,\n type OpenSourceBadgeProps,\n type PoweredByBadgeProps,\n} from \"./PoweredByBadge.js\";\nexport { FeedbackButton, type FeedbackButtonProps } from \"./FeedbackButton.js\";\nexport { ErrorBoundary } from \"./ErrorBoundary.js\";\nexport { installRouteChunkRecovery } from \"./route-chunk-recovery.js\";\nexport { ClientOnly } from \"./ClientOnly.js\";\nexport { DefaultSpinner } from \"./DefaultSpinner.js\";\nexport {\n getThemeInitScript,\n themeInitScript,\n type ThemePreference,\n} from \"./theme.js\";\nexport { AgentTerminal, type AgentTerminalProps } from \"./terminal/index.js\";\nexport {\n trackEvent,\n trackSessionStatus,\n configureTracking,\n setSentryUser,\n captureError,\n captureClientException,\n type ClientCaptureContext,\n} from \"./analytics.js\";\nexport {\n useCollaborativeDoc,\n emailToColor,\n emailToName,\n type UseCollaborativeDocOptions,\n type UseCollaborativeDocResult,\n type CollabUser,\n} from \"../collab/client.js\";\nexport {\n ResourcesPanel,\n ResourceTree,\n ResourceEditor,\n useResources,\n useResourceTree,\n useResource,\n useCreateResource,\n useUpdateResource,\n useDeleteResource,\n useUploadResource,\n type Resource,\n type ResourceMeta,\n type TreeNode,\n type ResourceScope,\n type ResourceTreeProps,\n type ResourceEditorProps,\n} from \"./resources/index.js\";\nexport type {\n AppToFrameMessage,\n FrameToAppMessage,\n FrameMessage,\n CodeCompleteMessage,\n ChatRunningMessage,\n} from \"./frame-protocol.js\";\nexport {\n CommandMenu,\n useCommandMenuShortcut,\n openAgentSidebar,\n submitToAgent,\n type CommandMenuProps,\n type CommandGroupProps,\n type CommandItemProps,\n type CommandShortcutProps,\n} from \"./CommandMenu.js\";\nexport {\n DevOverlay,\n useDevOverlayShortcut,\n registerDevPanel,\n unregisterDevPanel,\n listDevPanels,\n subscribeDevPanels,\n useDevOption,\n clearAllDevOverlayStorage,\n devOptionKey,\n DEV_OVERLAY_STORAGE_PREFIX,\n type DevOverlayProps,\n type DevPanel,\n type DevOption,\n type DevBooleanOption,\n type DevSelectOption,\n type DevStringOption,\n type DevActionOption,\n type DevOptionValue,\n} from \"./dev-overlay/index.js\";\nexport {\n useActionQuery,\n useActionMutation,\n type ActionRegistry,\n} from \"./use-action.js\";\nexport {\n ShareButton,\n ShareDialog,\n VisibilityBadge,\n type ShareButtonProps,\n type ShareDialogProps,\n type VisibilityBadgeProps,\n} from \"./sharing/index.js\";\nexport {\n postNavigate,\n isInAgentEmbed,\n AGENT_NAVIGATE_MESSAGE_TYPE,\n type AgentNavigateMessage,\n} from \"./embed.js\";\nexport { IframeEmbed, parseEmbedBody } from \"./IframeEmbed.js\";\nexport {\n useAvatarUrl,\n uploadAvatar,\n invalidateAvatarCache,\n} from \"./use-avatar.js\";\nexport {\n ObservabilityDashboard,\n ThumbsFeedback,\n} from \"./observability/index.js\";\n// Presence UI components\nexport {\n PresenceBar,\n type PresenceBarProps,\n} from \"./components/PresenceBar.js\";\nexport {\n AgentPresenceChip,\n type AgentPresenceChipProps,\n} from \"./components/AgentPresenceChip.js\";\n// Structured data collaboration hooks\nexport {\n useCollaborativeMap,\n useCollaborativeArray,\n type UseCollaborativeMapOptions,\n type UseCollaborativeMapResult,\n type UseCollaborativeArrayOptions,\n type UseCollaborativeArrayResult,\n} from \"../collab/client-struct.js\";\nexport { NotificationsBell } from \"./notifications/index.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AAwBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;
|
|
1
|
+
{"version":3,"file":"OrgSwitcher.d.ts","sourceRoot":"","sources":["../../../src/client/org/OrgSwitcher.tsx"],"names":[],"mappings":"AAwBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA6BD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,EAC1B,SAAS,EACT,cAAc,EACd,YAAY,EACZ,YAAsB,GACvB,EAAE,gBAAgB,2CAgalB"}
|
|
@@ -21,6 +21,9 @@ function personalLabelFromEmail(email) {
|
|
|
21
21
|
const POPOVER_CONTENT_CLASS = "z-50 min-w-[14rem] rounded-md border border-border bg-popover py-1 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2";
|
|
22
22
|
const ITEM_CLASS = "flex w-full items-center gap-2 px-2.5 py-1.5 text-xs text-foreground hover:bg-accent focus-visible:bg-accent focus:outline-none disabled:opacity-50 disabled:pointer-events-none";
|
|
23
23
|
const SECTION_LABEL_CLASS = "px-2.5 pt-1 pb-0.5 text-[10px] uppercase tracking-wide text-muted-foreground";
|
|
24
|
+
function workspaceSettingsPath(path) {
|
|
25
|
+
return `${path.replace(/#.*$/, "")}#workspace-settings`;
|
|
26
|
+
}
|
|
24
27
|
/**
|
|
25
28
|
* Compact org switcher button. Shows the active org (or "Personal" when the
|
|
26
29
|
* user has none); opens a popover with the user's other orgs, pending
|
|
@@ -127,7 +130,11 @@ export function OrgSwitcher({ className, hideWhenSingle, reserveSpace, settingsP
|
|
|
127
130
|
}, disabled: joinByDomain.isPending, className: "rounded px-1.5 py-0.5 text-[11px] font-medium text-primary hover:bg-primary/10 disabled:opacity-50 cursor-pointer", children: isJoining ? (_jsx(IconLoader2, { className: "h-3 w-3 animate-spin" })) : ("Join") })] }, match.orgId));
|
|
128
131
|
})] })), _jsx("div", { className: "my-1 h-px bg-border" }), inOrg && (_jsxs("button", { type: "button", onClick: () => {
|
|
129
132
|
setOpen(false);
|
|
130
|
-
|
|
133
|
+
window.dispatchEvent(new CustomEvent("agent-panel:open"));
|
|
134
|
+
window.dispatchEvent(new CustomEvent("agent-panel:open-settings", {
|
|
135
|
+
detail: { section: "workspace-settings" },
|
|
136
|
+
}));
|
|
137
|
+
navigate(workspaceSettingsPath(settingsPath));
|
|
131
138
|
}, className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconSettings, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-left", children: "Workspace settings" })] })), _jsxs("button", { type: "button", onClick: () => setMode("create"), className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconPlus, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-left", children: "Create organization" })] }), canInvite && (_jsxs("button", { type: "button", onClick: () => setMode("invite"), className: `${ITEM_CLASS} cursor-pointer`, children: [_jsx(IconUserPlus, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }), _jsx("span", { className: "flex-1 text-left", children: "Invite member" })] })), _jsx("div", { className: "my-1 h-px bg-border" }), _jsxs("button", { type: "button", onClick: handleSignOut, disabled: signingOut, className: `${ITEM_CLASS} cursor-pointer`, children: [signingOut ? (_jsx(IconLoader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-muted-foreground" })) : (_jsx(IconLogout, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" })), _jsxs("span", { className: "flex-1 text-left", children: ["Sign out", org.email ? (_jsxs("span", { className: "ml-1 text-muted-foreground", children: ["(", org.email, ")"] })) : null] })] }), (switchOrg.error ||
|
|
132
139
|
acceptInvitation.error ||
|
|
133
140
|
joinByDomain.error) && (_jsx("div", { className: "px-2.5 pt-1 text-[11px] text-destructive", children: (switchOrg.error ||
|