@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.
Files changed (117) hide show
  1. package/dist/agent/engine/index.d.ts +1 -1
  2. package/dist/agent/engine/index.d.ts.map +1 -1
  3. package/dist/agent/engine/index.js +1 -1
  4. package/dist/agent/engine/index.js.map +1 -1
  5. package/dist/agent/thread-data-builder.d.ts.map +1 -1
  6. package/dist/agent/thread-data-builder.js +2 -0
  7. package/dist/agent/thread-data-builder.js.map +1 -1
  8. package/dist/cli/templates-meta.d.ts.map +1 -1
  9. package/dist/cli/templates-meta.js +12 -14
  10. package/dist/cli/templates-meta.js.map +1 -1
  11. package/dist/client/AgentPanel.js +3 -2
  12. package/dist/client/AgentPanel.js.map +1 -1
  13. package/dist/client/CommandMenu.d.ts +1 -0
  14. package/dist/client/CommandMenu.d.ts.map +1 -1
  15. package/dist/client/CommandMenu.js +11 -3
  16. package/dist/client/CommandMenu.js.map +1 -1
  17. package/dist/client/ErrorBoundary.d.ts.map +1 -1
  18. package/dist/client/ErrorBoundary.js +15 -5
  19. package/dist/client/ErrorBoundary.js.map +1 -1
  20. package/dist/client/FeedbackButton.d.ts.map +1 -1
  21. package/dist/client/FeedbackButton.js +7 -3
  22. package/dist/client/FeedbackButton.js.map +1 -1
  23. package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
  24. package/dist/client/MultiTabAssistantChat.js +112 -33
  25. package/dist/client/MultiTabAssistantChat.js.map +1 -1
  26. package/dist/client/NewWorkspaceAppFlow.js +1 -1
  27. package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
  28. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  29. package/dist/client/agent-chat-adapter.js +63 -14
  30. package/dist/client/agent-chat-adapter.js.map +1 -1
  31. package/dist/client/components/icons/AgentNativeIcon.d.ts +20 -0
  32. package/dist/client/components/icons/AgentNativeIcon.d.ts.map +1 -0
  33. package/dist/client/components/icons/AgentNativeIcon.js +12 -0
  34. package/dist/client/components/icons/AgentNativeIcon.js.map +1 -0
  35. package/dist/client/index.d.ts +1 -0
  36. package/dist/client/index.d.ts.map +1 -1
  37. package/dist/client/index.js +1 -0
  38. package/dist/client/index.js.map +1 -1
  39. package/dist/client/notifications/NotificationsBell.d.ts +5 -1
  40. package/dist/client/notifications/NotificationsBell.d.ts.map +1 -1
  41. package/dist/client/notifications/NotificationsBell.js +2 -2
  42. package/dist/client/notifications/NotificationsBell.js.map +1 -1
  43. package/dist/client/onboarding/OnboardingPanel.js +19 -4
  44. package/dist/client/onboarding/OnboardingPanel.js.map +1 -1
  45. package/dist/client/org/TeamPage.d.ts.map +1 -1
  46. package/dist/client/org/TeamPage.js +4 -1
  47. package/dist/client/org/TeamPage.js.map +1 -1
  48. package/dist/client/settings/UsageSection.d.ts.map +1 -1
  49. package/dist/client/settings/UsageSection.js +41 -8
  50. package/dist/client/settings/UsageSection.js.map +1 -1
  51. package/dist/client/sharing/ShareButton.d.ts +14 -0
  52. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  53. package/dist/client/sharing/ShareButton.js +36 -14
  54. package/dist/client/sharing/ShareButton.js.map +1 -1
  55. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  56. package/dist/client/sharing/ShareDialog.js +16 -6
  57. package/dist/client/sharing/ShareDialog.js.map +1 -1
  58. package/dist/client/sse-event-processor.d.ts.map +1 -1
  59. package/dist/client/sse-event-processor.js +43 -4
  60. package/dist/client/sse-event-processor.js.map +1 -1
  61. package/dist/client/use-chat-threads.d.ts +1 -1
  62. package/dist/client/use-chat-threads.d.ts.map +1 -1
  63. package/dist/client/use-chat-threads.js +2 -2
  64. package/dist/client/use-chat-threads.js.map +1 -1
  65. package/dist/client/useProductionAgent.js +2 -2
  66. package/dist/client/useProductionAgent.js.map +1 -1
  67. package/dist/index.d.ts +1 -1
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +1 -1
  70. package/dist/index.js.map +1 -1
  71. package/dist/onboarding/types.d.ts +6 -2
  72. package/dist/onboarding/types.d.ts.map +1 -1
  73. package/dist/onboarding/types.js.map +1 -1
  74. package/dist/server/auth.d.ts +11 -0
  75. package/dist/server/auth.d.ts.map +1 -1
  76. package/dist/server/auth.js +7 -1
  77. package/dist/server/auth.js.map +1 -1
  78. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  79. package/dist/server/core-routes-plugin.js +45 -5
  80. package/dist/server/core-routes-plugin.js.map +1 -1
  81. package/dist/server/credential-provider.d.ts +5 -0
  82. package/dist/server/credential-provider.d.ts.map +1 -1
  83. package/dist/server/credential-provider.js +8 -0
  84. package/dist/server/credential-provider.js.map +1 -1
  85. package/dist/server/index.d.ts +1 -1
  86. package/dist/server/index.d.ts.map +1 -1
  87. package/dist/server/index.js +1 -1
  88. package/dist/server/index.js.map +1 -1
  89. package/dist/server/onboarding-html.d.ts +12 -0
  90. package/dist/server/onboarding-html.d.ts.map +1 -1
  91. package/dist/server/onboarding-html.js +86 -0
  92. package/dist/server/onboarding-html.js.map +1 -1
  93. package/dist/server/ssr-handler.d.ts.map +1 -1
  94. package/dist/server/ssr-handler.js +16 -6
  95. package/dist/server/ssr-handler.js.map +1 -1
  96. package/dist/sharing/actions/share-resource.d.ts +1 -0
  97. package/dist/sharing/actions/share-resource.d.ts.map +1 -1
  98. package/dist/sharing/actions/share-resource.js +65 -3
  99. package/dist/sharing/actions/share-resource.js.map +1 -1
  100. package/dist/sharing/registry.d.ts +5 -0
  101. package/dist/sharing/registry.d.ts.map +1 -1
  102. package/dist/sharing/registry.js.map +1 -1
  103. package/dist/usage/store.d.ts +16 -0
  104. package/dist/usage/store.d.ts.map +1 -1
  105. package/dist/usage/store.js +31 -0
  106. package/dist/usage/store.js.map +1 -1
  107. package/dist/vite/client.d.ts.map +1 -1
  108. package/dist/vite/client.js +11 -6
  109. package/dist/vite/client.js.map +1 -1
  110. package/docs/content/faq.md +1 -2
  111. package/docs/content/getting-started.md +1 -2
  112. package/docs/content/onboarding.md +8 -6
  113. package/docs/content/sharing.md +9 -7
  114. package/docs/content/template-images.md +2 -1
  115. package/docs/content/template-slides.md +2 -2
  116. package/docs/content/what-is-agent-native.md +1 -1
  117. 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 [selectedModelForActiveThread, setSelectedModelForActiveThread] = useState(undefined);
134
- const [selectedEffortForActiveThread, setSelectedEffortForActiveThread] = useState("auto");
135
- const activeThreadModel = selectedModelForActiveThread ?? defaultModel;
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
- threadModelRef.current.set(threadId, { model, engine, effort });
147
- setSelectedModelForActiveThread(model);
148
- setSelectedEffortForActiveThread(effort);
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 = threadModelRef.current.get(threadId);
155
- threadModelRef.current.set(threadId, {
156
- model: existing?.model ?? defaultModel,
157
- engine: existing?.engine ?? availableModels[0]?.engine ?? "",
158
- effort,
159
- });
160
- setSelectedEffortForActiveThread(effort);
161
- }, [availableModels, defaultModel]);
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 and sync model state when switching tabs
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
- setSelectedModelForActiveThread(model);
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) => (_jsx("div", { className: "flex-1 min-h-0", style: {
920
- display: contentHidden || tabId !== activeThreadId ? "none" : "flex",
921
- }, children: _jsx(AssistantChat, { ...props, ref: (handle) => {
922
- if (handle) {
923
- chatRefs.current.set(tabId, handle);
924
- }
925
- else {
926
- chatRefs.current.delete(tabId);
927
- }
928
- }, threadId: tabId, tabId: tabId, apiUrl: apiUrl, isNewThread: newThreadIds.current.has(tabId), onMessageCountChange: (count) => setMessageCounts((prev) => prev[tabId] === count ? prev : { ...prev, [tabId]: count }), onSaveThread: handleSaveThread, onGenerateTitle: handleGenerateTitle, onSlashCommand: handleSlashCommand, selectedModel: threadModelRef.current.get(tabId)?.model, selectedEngine: threadModelRef.current.get(tabId)?.engine, selectedEffort: threadModelRef.current.get(tabId)?.effort ?? "auto", defaultModel: defaultModel, availableModels: availableModels, onModelChange: handleModelChange, onEffortChange: handleEffortChange, onForkChat: () => handleForkChat(tabId) }) }, tabId)))] })] }));
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