@agent-native/core 0.12.5 → 0.12.7
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/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/thread-data-builder.d.ts.map +1 -1
- package/dist/agent/thread-data-builder.js +2 -0
- package/dist/agent/thread-data-builder.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +12 -14
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentPanel.js +3 -2
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/CommandMenu.d.ts +1 -0
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +11 -3
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +15 -5
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +7 -3
- package/dist/client/FeedbackButton.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +112 -33
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +1 -1
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +63 -14
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/components/icons/AgentNativeIcon.d.ts +20 -0
- package/dist/client/components/icons/AgentNativeIcon.d.ts.map +1 -0
- package/dist/client/components/icons/AgentNativeIcon.js +12 -0
- package/dist/client/components/icons/AgentNativeIcon.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/notifications/NotificationsBell.d.ts +5 -1
- package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
- package/dist/client/notifications/NotificationsBell.js +2 -2
- package/dist/client/notifications/NotificationsBell.js.map +1 -1
- package/dist/client/onboarding/OnboardingPanel.js +19 -4
- package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +4 -1
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/settings/UsageSection.d.ts.map +1 -1
- package/dist/client/settings/UsageSection.js +41 -8
- package/dist/client/settings/UsageSection.js.map +1 -1
- package/dist/client/sharing/ShareButton.d.ts +14 -0
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +36 -14
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +16 -6
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +43 -4
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +2 -2
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/useProductionAgent.js +2 -2
- package/dist/client/useProductionAgent.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/onboarding/types.d.ts +6 -2
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/onboarding/types.js.map +1 -1
- package/dist/server/auth.d.ts +11 -0
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +7 -1
- package/dist/server/auth.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +45 -5
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +5 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +8 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts +12 -0
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +86 -0
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +16 -6
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts +1 -0
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.js +65 -3
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/sharing/registry.d.ts +5 -0
- package/dist/sharing/registry.d.ts.map +1 -1
- package/dist/sharing/registry.js.map +1 -1
- package/dist/usage/store.d.ts +16 -0
- package/dist/usage/store.d.ts.map +1 -1
- package/dist/usage/store.js +31 -0
- package/dist/usage/store.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +11 -6
- package/dist/vite/client.js.map +1 -1
- package/docs/content/faq.md +1 -2
- package/docs/content/getting-started.md +1 -2
- package/docs/content/onboarding.md +8 -6
- package/docs/content/sharing.md +9 -7
- package/docs/content/template-images.md +2 -1
- package/docs/content/template-slides.md +2 -2
- package/docs/content/what-is-agent-native.md +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,60 @@ import { useChatThreads } from "./use-chat-threads.js";
|
|
|
9
9
|
import { agentNativePath } from "./api-path.js";
|
|
10
10
|
import { DEFAULT_MODEL } from "../agent/default-model.js";
|
|
11
11
|
import { getReasoningEffortOptionsForModel, isReasoningEffort, } from "../shared/reasoning-effort.js";
|
|
12
|
+
const MODEL_SELECTION_STORAGE_KEY = "agent-native:chat-models:selection";
|
|
13
|
+
function readStoredModelSelection(key) {
|
|
14
|
+
if (typeof window === "undefined")
|
|
15
|
+
return undefined;
|
|
16
|
+
try {
|
|
17
|
+
const raw = window.localStorage.getItem(key);
|
|
18
|
+
if (!raw)
|
|
19
|
+
return undefined;
|
|
20
|
+
const parsed = JSON.parse(raw);
|
|
21
|
+
if (typeof parsed.model !== "string" || !parsed.model.trim()) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const selection = {
|
|
25
|
+
model: parsed.model,
|
|
26
|
+
effort: isReasoningEffort(parsed.effort) ? parsed.effort : "auto",
|
|
27
|
+
};
|
|
28
|
+
if (typeof parsed.engine === "string")
|
|
29
|
+
selection.engine = parsed.engine;
|
|
30
|
+
return selection;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function writeStoredModelSelection(key, selection) {
|
|
37
|
+
if (typeof window === "undefined")
|
|
38
|
+
return;
|
|
39
|
+
try {
|
|
40
|
+
window.localStorage.setItem(key, JSON.stringify(selection));
|
|
41
|
+
}
|
|
42
|
+
catch { }
|
|
43
|
+
}
|
|
44
|
+
function resolveModelSelection(selection, groups) {
|
|
45
|
+
if (!selection?.model)
|
|
46
|
+
return undefined;
|
|
47
|
+
const preferredGroup = groups.find((group) => group.engine === selection.engine &&
|
|
48
|
+
group.models.includes(selection.model));
|
|
49
|
+
const fallbackGroup = groups.find((group) => group.models.includes(selection.model));
|
|
50
|
+
if (groups.length > 0 && !preferredGroup && !fallbackGroup) {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
const engine = preferredGroup?.engine ?? fallbackGroup?.engine ?? selection.engine;
|
|
54
|
+
if (!engine && groups.length > 0)
|
|
55
|
+
return undefined;
|
|
56
|
+
const requestedEffort = selection.effort ?? "auto";
|
|
57
|
+
const effortOptions = getReasoningEffortOptionsForModel(selection.model);
|
|
58
|
+
const effort = requestedEffort === "auto" || effortOptions.includes(requestedEffort)
|
|
59
|
+
? requestedEffort
|
|
60
|
+
: "auto";
|
|
61
|
+
const resolved = { model: selection.model, effort };
|
|
62
|
+
if (engine)
|
|
63
|
+
resolved.engine = engine;
|
|
64
|
+
return resolved;
|
|
65
|
+
}
|
|
12
66
|
// ─── Skeleton Loader ─────────────────────────────────────────────────────────
|
|
13
67
|
function ChatSkeleton({ header, headerOnly = false, }) {
|
|
14
68
|
return (_jsxs("div", { className: cn("flex flex-col min-h-0", headerOnly ? "shrink-0" : "flex-1 h-full"), children: [header ?? (_jsxs("div", { className: "flex items-center px-1 py-1 border-b border-border shrink-0 gap-0.5", children: [_jsx("div", { className: "h-[22px] w-20 rounded-md bg-muted animate-pulse" }), _jsxs("div", { className: "ml-auto flex gap-0.5", children: [_jsx("div", { className: "h-[22px] w-[22px] rounded-md bg-muted animate-pulse" }), _jsx("div", { className: "h-[22px] w-[22px] rounded-md bg-muted animate-pulse" })] })] })), !headerOnly && (_jsxs("div", { className: "flex-1 flex flex-col gap-3 p-4", children: [_jsx("div", { className: "flex justify-center py-8", children: _jsx("div", { className: "h-10 w-10 rounded-full bg-muted animate-pulse" }) }), _jsx("div", { className: "h-3 w-32 rounded bg-muted animate-pulse mx-auto" })] }))] }));
|
|
@@ -114,6 +168,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
114
168
|
const { threads, activeThreadId, isLoading, createThread, switchThread, deleteThread, forkThread, saveThreadData, generateTitle, searchThreads, refreshThreads, } = useChatThreads(apiUrl, storageKey);
|
|
115
169
|
// Namespace all localStorage keys by storageKey when provided (for per-app isolation in frame)
|
|
116
170
|
const keyPrefix = storageKey ? `:${storageKey}` : "";
|
|
171
|
+
const modelSelectionKey = `${MODEL_SELECTION_STORAGE_KEY}${keyPrefix}`;
|
|
117
172
|
// Track which tabs have been focused at least once (lazy mount for sub-agent tabs)
|
|
118
173
|
const mountedTabsRef = useRef(new Set());
|
|
119
174
|
const activeThreadIdRef = useRef(activeThreadId);
|
|
@@ -130,9 +185,19 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
130
185
|
const [availableModels, setAvailableModels] = useState([]);
|
|
131
186
|
const [defaultModel, setDefaultModel] = useState(DEFAULT_MODEL);
|
|
132
187
|
const threadModelRef = useRef(new Map());
|
|
133
|
-
const [
|
|
134
|
-
const [
|
|
135
|
-
|
|
188
|
+
const [persistedModelSelection, setPersistedModelSelection] = useState(() => readStoredModelSelection(modelSelectionKey));
|
|
189
|
+
const [modelSelectionVersion, setModelSelectionVersion] = useState(0);
|
|
190
|
+
useEffect(() => {
|
|
191
|
+
setPersistedModelSelection(readStoredModelSelection(modelSelectionKey));
|
|
192
|
+
}, [modelSelectionKey]);
|
|
193
|
+
const bumpModelSelectionVersion = useCallback(() => {
|
|
194
|
+
setModelSelectionVersion((version) => version + 1);
|
|
195
|
+
}, []);
|
|
196
|
+
const resolveThreadModelSelection = useCallback((threadId) => resolveModelSelection(threadModelRef.current.get(threadId) ?? persistedModelSelection, availableModels), [availableModels, persistedModelSelection, modelSelectionVersion]);
|
|
197
|
+
const persistModelSelection = useCallback((selection) => {
|
|
198
|
+
setPersistedModelSelection(selection);
|
|
199
|
+
writeStoredModelSelection(modelSelectionKey, selection);
|
|
200
|
+
}, [modelSelectionKey]);
|
|
136
201
|
const handleModelChange = useCallback((model, engine) => {
|
|
137
202
|
const threadId = activeThreadIdRef.current;
|
|
138
203
|
if (!threadId)
|
|
@@ -143,22 +208,33 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
143
208
|
const effort = existingEffort === "auto" || effortOptions.includes(existingEffort)
|
|
144
209
|
? existingEffort
|
|
145
210
|
: "auto";
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
211
|
+
const selection = { model, engine, effort };
|
|
212
|
+
threadModelRef.current.set(threadId, selection);
|
|
213
|
+
persistModelSelection(selection);
|
|
214
|
+
bumpModelSelectionVersion();
|
|
215
|
+
}, [bumpModelSelectionVersion, persistModelSelection]);
|
|
150
216
|
const handleEffortChange = useCallback((effort) => {
|
|
151
217
|
const threadId = activeThreadIdRef.current;
|
|
152
218
|
if (!threadId)
|
|
153
219
|
return;
|
|
154
|
-
const existing =
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
|
|
220
|
+
const existing = resolveThreadModelSelection(threadId);
|
|
221
|
+
const model = existing?.model ?? defaultModel;
|
|
222
|
+
const engine = existing?.engine ??
|
|
223
|
+
availableModels.find((group) => group.models.includes(model))?.engine ??
|
|
224
|
+
availableModels[0]?.engine;
|
|
225
|
+
const selection = { model, effort };
|
|
226
|
+
if (engine)
|
|
227
|
+
selection.engine = engine;
|
|
228
|
+
threadModelRef.current.set(threadId, selection);
|
|
229
|
+
persistModelSelection(selection);
|
|
230
|
+
bumpModelSelectionVersion();
|
|
231
|
+
}, [
|
|
232
|
+
availableModels,
|
|
233
|
+
bumpModelSelectionVersion,
|
|
234
|
+
defaultModel,
|
|
235
|
+
persistModelSelection,
|
|
236
|
+
resolveThreadModelSelection,
|
|
237
|
+
]);
|
|
162
238
|
const refreshEngines = useCallback(() => {
|
|
163
239
|
Promise.all([
|
|
164
240
|
fetch(agentNativePath("/_agent-native/actions/manage-agent-engine"), {
|
|
@@ -401,13 +477,10 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
401
477
|
});
|
|
402
478
|
}
|
|
403
479
|
}, [isLoading, openTabIds, createThread]);
|
|
404
|
-
// Focus the composer
|
|
480
|
+
// Focus the composer when switching tabs
|
|
405
481
|
useEffect(() => {
|
|
406
482
|
if (!activeThreadId)
|
|
407
483
|
return;
|
|
408
|
-
// Sync model picker to this thread's override (or clear to default)
|
|
409
|
-
setSelectedModelForActiveThread(threadModelRef.current.get(activeThreadId)?.model ?? undefined);
|
|
410
|
-
setSelectedEffortForActiveThread(threadModelRef.current.get(activeThreadId)?.effort ?? "auto");
|
|
411
484
|
// Small delay to ensure the tab is visible before focusing
|
|
412
485
|
const t = setTimeout(() => {
|
|
413
486
|
chatRefs.current.get(activeThreadId)?.focusComposer();
|
|
@@ -467,6 +540,8 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
467
540
|
const model = event.data.data?.model;
|
|
468
541
|
const effort = event.data.data?.effort;
|
|
469
542
|
const newTab = event.data.data?.newTab;
|
|
543
|
+
const tabId = event.data.data?.tabId;
|
|
544
|
+
const requestedTabId = typeof tabId === "string" ? tabId : undefined;
|
|
470
545
|
const background = event.data.data?.background;
|
|
471
546
|
// Make sure the sidebar is visible to show the response, unless the
|
|
472
547
|
// caller explicitly opted out or it's a background send.
|
|
@@ -494,8 +569,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
494
569
|
engine: matchedGroup.engine,
|
|
495
570
|
effort: selectedEffort,
|
|
496
571
|
});
|
|
497
|
-
|
|
498
|
-
setSelectedEffortForActiveThread(selectedEffort);
|
|
572
|
+
bumpModelSelectionVersion();
|
|
499
573
|
}
|
|
500
574
|
}
|
|
501
575
|
const ref = chatRefs.current.get(threadId);
|
|
@@ -508,7 +582,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
508
582
|
};
|
|
509
583
|
if (newTab) {
|
|
510
584
|
const previousTabId = activeThreadIdRef.current;
|
|
511
|
-
createThread().then((newId) => {
|
|
585
|
+
createThread(requestedTabId).then((newId) => {
|
|
512
586
|
if (newId) {
|
|
513
587
|
newThreadIds.current.add(newId);
|
|
514
588
|
sendToTab(newId);
|
|
@@ -527,7 +601,7 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
527
601
|
};
|
|
528
602
|
window.addEventListener("message", handler);
|
|
529
603
|
return () => window.removeEventListener("message", handler);
|
|
530
|
-
}, [availableModels, createThread, switchThread]);
|
|
604
|
+
}, [availableModels, bumpModelSelectionVersion, createThread, switchThread]);
|
|
531
605
|
// Process pending sends when refs mount
|
|
532
606
|
useEffect(() => {
|
|
533
607
|
for (const [tabId, message] of pendingSends.current) {
|
|
@@ -916,15 +990,20 @@ export function MultiTabAssistantChat({ showTabBar = true, renderHeader, renderO
|
|
|
916
990
|
})()
|
|
917
991
|
: null, _jsxs("div", { className: "relative flex-1 flex flex-col min-h-0", children: [renderOverlay ? renderOverlay(headerProps) : null, showHistory && (_jsx(HistoryPopover, { threads: threads, openTabIds: new Set(openTabIds), onSelect: openFromHistory, onClose: () => setShowHistory(false), onSearch: searchThreads })), helpVisible && _jsx(HelpPopover, { onClose: () => setHelpVisible(false) }), [...new Set(openTabIds)]
|
|
918
992
|
.filter((tabId) => tabId === activeThreadId || mountedTabsRef.current.has(tabId))
|
|
919
|
-
.map((tabId) =>
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
993
|
+
.map((tabId) => {
|
|
994
|
+
const modelSelection = resolveThreadModelSelection(tabId);
|
|
995
|
+
return (_jsx("div", { className: "flex-1 min-h-0", style: {
|
|
996
|
+
display: contentHidden || tabId !== activeThreadId ? "none" : "flex",
|
|
997
|
+
}, children: _jsx(AssistantChat, { ...props, ref: (handle) => {
|
|
998
|
+
if (handle) {
|
|
999
|
+
chatRefs.current.set(tabId, handle);
|
|
1000
|
+
}
|
|
1001
|
+
else {
|
|
1002
|
+
chatRefs.current.delete(tabId);
|
|
1003
|
+
}
|
|
1004
|
+
}, threadId: tabId, tabId: tabId, apiUrl: apiUrl, isNewThread: newThreadIds.current.has(tabId), onMessageCountChange: (count) => setMessageCounts((prev) => prev[tabId] === count
|
|
1005
|
+
? prev
|
|
1006
|
+
: { ...prev, [tabId]: count }), onSaveThread: handleSaveThread, onGenerateTitle: handleGenerateTitle, onSlashCommand: handleSlashCommand, selectedModel: modelSelection?.model, selectedEngine: modelSelection?.engine, selectedEffort: modelSelection?.effort ?? "auto", defaultModel: defaultModel, availableModels: availableModels, onModelChange: handleModelChange, onEffortChange: handleEffortChange, onForkChat: () => handleForkChat(tabId) }) }, tabId));
|
|
1007
|
+
})] })] }));
|
|
929
1008
|
}
|
|
930
1009
|
//# sourceMappingURL=MultiTabAssistantChat.js.map
|