@ottocode/web-sdk 0.1.310 → 0.1.312
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/assets/provider-logos.d.ts +1 -0
- package/dist/assets/provider-logos.d.ts.map +1 -1
- package/dist/components/chat/ChatInput.d.ts +4 -0
- package/dist/components/chat/ChatInput.d.ts.map +1 -1
- package/dist/components/chat/ChatInputContainer.d.ts +4 -0
- package/dist/components/chat/ChatInputContainer.d.ts.map +1 -1
- package/dist/components/chat/ConfigModal.d.ts +3 -1
- package/dist/components/chat/ConfigModal.d.ts.map +1 -1
- package/dist/components/chat/ConfigSelector.d.ts.map +1 -1
- package/dist/components/chat/InputApprovalBar.d.ts.map +1 -1
- package/dist/components/chat/InputSecureInputBar.d.ts.map +1 -1
- package/dist/components/chat/InputSubagentsBar.d.ts.map +1 -1
- package/dist/components/chat/InputTodosBar.d.ts.map +1 -1
- package/dist/components/chat/NewSessionLanding.d.ts +4 -0
- package/dist/components/chat/NewSessionLanding.d.ts.map +1 -1
- package/dist/components/chat/input-bar-chrome.d.ts +24 -0
- package/dist/components/chat/input-bar-chrome.d.ts.map +1 -0
- package/dist/components/common/OttoOIcon.d.ts +8 -0
- package/dist/components/common/OttoOIcon.d.ts.map +1 -0
- package/dist/components/common/ProviderLogo.d.ts.map +1 -1
- package/dist/components/index.d.ts +3 -2
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +4718 -3514
- package/dist/components/index.js.map +46 -36
- package/dist/components/messages/MessageThreadContainer.d.ts +6 -0
- package/dist/components/messages/MessageThreadContainer.d.ts.map +1 -1
- package/dist/components/messages/OttoKickoffNotice.d.ts +15 -0
- package/dist/components/messages/OttoKickoffNotice.d.ts.map +1 -0
- package/dist/components/messages/OttoWakeupNotice.d.ts +12 -0
- package/dist/components/messages/OttoWakeupNotice.d.ts.map +1 -0
- package/dist/components/messages/UserMessageGroup.d.ts.map +1 -1
- package/dist/components/messages/compactActivity.d.ts.map +1 -1
- package/dist/components/messages/otto-notice-parsing.d.ts +43 -0
- package/dist/components/messages/otto-notice-parsing.d.ts.map +1 -0
- package/dist/components/messages/renderers/GoalToolRenderer.d.ts.map +1 -1
- package/dist/components/onboarding/OnboardingModal.d.ts.map +1 -1
- package/dist/components/onboarding/steps/ProviderSetupStep.d.ts +10 -0
- package/dist/components/onboarding/steps/ProviderSetupStep.d.ts.map +1 -1
- package/dist/components/otto/OttoGoalBar.d.ts +18 -0
- package/dist/components/otto/OttoGoalBar.d.ts.map +1 -0
- package/dist/components/otto/OttoSessionRail.d.ts +15 -0
- package/dist/components/otto/OttoSessionRail.d.ts.map +1 -0
- package/dist/components/otto/OttoSessionView.d.ts +14 -0
- package/dist/components/otto/OttoSessionView.d.ts.map +1 -0
- package/dist/components/otto/OttoTabBar.d.ts +20 -0
- package/dist/components/otto/OttoTabBar.d.ts.map +1 -0
- package/dist/components/otto/OttoWorkspace.d.ts +20 -0
- package/dist/components/otto/OttoWorkspace.d.ts.map +1 -0
- package/dist/components/otto/index.d.ts +7 -0
- package/dist/components/otto/index.d.ts.map +1 -0
- package/dist/components/sessions/SessionListContainer.d.ts +8 -0
- package/dist/components/sessions/SessionListContainer.d.ts.map +1 -1
- package/dist/components/subagents/SubagentFloatingViewer.d.ts +3 -2
- package/dist/components/subagents/SubagentFloatingViewer.d.ts.map +1 -1
- package/dist/components/titlebar/TitleBar.d.ts +48 -0
- package/dist/components/titlebar/TitleBar.d.ts.map +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +267 -70
- package/dist/hooks/index.js.map +13 -12
- package/dist/hooks/useAgents.d.ts.map +1 -1
- package/dist/hooks/useAuthStatus.d.ts +5 -0
- package/dist/hooks/useAuthStatus.d.ts.map +1 -1
- package/dist/hooks/useChatComposer.d.ts.map +1 -1
- package/dist/hooks/useEdgeHover.d.ts +26 -0
- package/dist/hooks/useEdgeHover.d.ts.map +1 -0
- package/dist/hooks/useGoals.d.ts +34 -6
- package/dist/hooks/useGoals.d.ts.map +1 -1
- package/dist/hooks/useSessionStream.d.ts.map +1 -1
- package/dist/hooks/useSessions.d.ts +9 -2
- package/dist/hooks/useSessions.d.ts.map +1 -1
- package/dist/index.js +4864 -3571
- package/dist/index.js.map +48 -38
- package/dist/lib/api-client/auth.d.ts +10 -0
- package/dist/lib/api-client/auth.d.ts.map +1 -1
- package/dist/lib/api-client/goals.d.ts +9 -1
- package/dist/lib/api-client/goals.d.ts.map +1 -1
- package/dist/lib/api-client/index.d.ts +18 -0
- package/dist/lib/api-client/index.d.ts.map +1 -1
- package/dist/lib/api-client/sessions.d.ts +2 -0
- package/dist/lib/api-client/sessions.d.ts.map +1 -1
- package/dist/lib/index.js +45 -3
- package/dist/lib/index.js.map +6 -6
- package/dist/stores/index.d.ts +1 -1
- package/dist/stores/index.d.ts.map +1 -1
- package/dist/stores/index.js +57 -56
- package/dist/stores/index.js.map +6 -6
- package/dist/stores/subagentViewerStore.d.ts +20 -5
- package/dist/stores/subagentViewerStore.d.ts.map +1 -1
- package/dist/stores/workspaceTabStore.d.ts +14 -0
- package/dist/stores/workspaceTabStore.d.ts.map +1 -0
- package/dist/types/api.d.ts +2 -2
- package/dist/types/api.d.ts.map +1 -1
- package/package.json +3 -3
- package/dist/components/goals/GoalsSidebar.d.ts +0 -6
- package/dist/components/goals/GoalsSidebar.d.ts.map +0 -1
- package/dist/components/goals/GoalsSidebarToggle.d.ts +0 -6
- package/dist/components/goals/GoalsSidebarToggle.d.ts.map +0 -1
- package/dist/components/goals/index.d.ts +0 -3
- package/dist/components/goals/index.d.ts.map +0 -1
- package/dist/stores/goalsPanelStore.d.ts +0 -9
- package/dist/stores/goalsPanelStore.d.ts.map +0 -1
package/dist/hooks/index.js
CHANGED
|
@@ -5,6 +5,7 @@ import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
|
|
5
5
|
import {
|
|
6
6
|
createSession as apiCreateSession,
|
|
7
7
|
listSessions as apiListSessions,
|
|
8
|
+
getSession as apiGetSession,
|
|
8
9
|
listMessages as apiListMessages,
|
|
9
10
|
createMessage as apiCreateMessage,
|
|
10
11
|
abortSession as apiAbortSession,
|
|
@@ -243,9 +244,9 @@ var sessionsMixin = {
|
|
|
243
244
|
return page.items;
|
|
244
245
|
},
|
|
245
246
|
async getSessionsPage(params = {}) {
|
|
246
|
-
const { limit = 50, offset = 0 } = params;
|
|
247
|
+
const { limit = 50, offset = 0, sessionType } = params;
|
|
247
248
|
const response = await apiListSessions({
|
|
248
|
-
query: { limit, offset }
|
|
249
|
+
query: sessionType ? { limit, offset, sessionType } : { limit, offset }
|
|
249
250
|
});
|
|
250
251
|
if (response.error)
|
|
251
252
|
throw new Error(extractErrorMessage(response.error));
|
|
@@ -266,6 +267,12 @@ var sessionsMixin = {
|
|
|
266
267
|
throw new Error("No data returned from create session");
|
|
267
268
|
return convertSession(response.data);
|
|
268
269
|
},
|
|
270
|
+
async getSession(sessionId) {
|
|
271
|
+
const response = await apiGetSession({ path: { sessionId } });
|
|
272
|
+
if (response.error)
|
|
273
|
+
throw new Error(extractErrorMessage(response.error));
|
|
274
|
+
return convertSession(response.data);
|
|
275
|
+
},
|
|
269
276
|
async updateSession(sessionId, data) {
|
|
270
277
|
const response = await apiUpdateSession({
|
|
271
278
|
path: { sessionId },
|
|
@@ -762,13 +769,21 @@ var branchesMixin = {
|
|
|
762
769
|
import {
|
|
763
770
|
getSessionGoal as apiGetSessionGoal,
|
|
764
771
|
createSessionGoal as apiCreateSessionGoal,
|
|
772
|
+
listGoals as apiListGoals,
|
|
765
773
|
updateGoal as apiUpdateGoal,
|
|
766
774
|
addGoalTasks as apiAddGoalTasks,
|
|
767
775
|
updateGoalTask as apiUpdateGoalTask,
|
|
776
|
+
deleteGoalTask as apiDeleteGoalTask,
|
|
768
777
|
startGoal as apiStartGoal,
|
|
769
778
|
listSessionSubagents as apiListSessionSubagents
|
|
770
779
|
} from "@ottocode/api";
|
|
771
780
|
var goalsMixin = {
|
|
781
|
+
async listGoals() {
|
|
782
|
+
const response = await apiListGoals();
|
|
783
|
+
if (response.error)
|
|
784
|
+
throw new Error(extractErrorMessage(response.error));
|
|
785
|
+
return response.data;
|
|
786
|
+
},
|
|
772
787
|
async getSessionGoal(sessionId) {
|
|
773
788
|
const response = await apiGetSessionGoal({ path: { sessionId } });
|
|
774
789
|
if (response.error)
|
|
@@ -811,6 +826,12 @@ var goalsMixin = {
|
|
|
811
826
|
throw new Error(extractErrorMessage(response.error));
|
|
812
827
|
return response.data;
|
|
813
828
|
},
|
|
829
|
+
async deleteGoalTask(goalId, taskId) {
|
|
830
|
+
const response = await apiDeleteGoalTask({ path: { goalId, taskId } });
|
|
831
|
+
if (response.error)
|
|
832
|
+
throw new Error(extractErrorMessage(response.error));
|
|
833
|
+
return response.data;
|
|
834
|
+
},
|
|
814
835
|
async startGoal(goalId) {
|
|
815
836
|
const response = await apiStartGoal({ path: { goalId } });
|
|
816
837
|
if (response.error)
|
|
@@ -1006,6 +1027,8 @@ import {
|
|
|
1006
1027
|
pollOpenAiDeviceFlow as apiPollOpenAiDeviceFlow,
|
|
1007
1028
|
startCopilotDeviceFlow as apiStartCopilotDeviceFlow,
|
|
1008
1029
|
pollCopilotDeviceFlow as apiPollCopilotDeviceFlow,
|
|
1030
|
+
startKimiDeviceFlow as apiStartKimiDeviceFlow,
|
|
1031
|
+
pollKimiDeviceFlow as apiPollKimiDeviceFlow,
|
|
1009
1032
|
getCopilotAuthMethods as apiGetCopilotAuthMethods,
|
|
1010
1033
|
saveCopilotToken as apiSaveCopilotToken,
|
|
1011
1034
|
importCopilotTokenFromGh as apiImportCopilotTokenFromGh,
|
|
@@ -1112,6 +1135,20 @@ var authMixin = {
|
|
|
1112
1135
|
throw new Error(extractErrorMessage(response.error));
|
|
1113
1136
|
return response.data;
|
|
1114
1137
|
},
|
|
1138
|
+
async startKimiDeviceFlow() {
|
|
1139
|
+
const response = await apiStartKimiDeviceFlow();
|
|
1140
|
+
if (response.error)
|
|
1141
|
+
throw new Error(extractErrorMessage(response.error));
|
|
1142
|
+
return response.data;
|
|
1143
|
+
},
|
|
1144
|
+
async pollKimiDeviceFlow(sessionId) {
|
|
1145
|
+
const response = await apiPollKimiDeviceFlow({
|
|
1146
|
+
body: { sessionId }
|
|
1147
|
+
});
|
|
1148
|
+
if (response.error)
|
|
1149
|
+
throw new Error(extractErrorMessage(response.error));
|
|
1150
|
+
return response.data;
|
|
1151
|
+
},
|
|
1115
1152
|
async getCopilotAuthMethods() {
|
|
1116
1153
|
const response = await apiGetCopilotAuthMethods();
|
|
1117
1154
|
if (response.error)
|
|
@@ -1327,6 +1364,7 @@ class ApiClient {
|
|
|
1327
1364
|
getSessions = sessionsMixin.getSessions;
|
|
1328
1365
|
getSessionsPage = sessionsMixin.getSessionsPage;
|
|
1329
1366
|
createSession = sessionsMixin.createSession;
|
|
1367
|
+
getSession = sessionsMixin.getSession;
|
|
1330
1368
|
updateSession = sessionsMixin.updateSession;
|
|
1331
1369
|
markSessionViewed = sessionsMixin.markSessionViewed;
|
|
1332
1370
|
deleteSession = sessionsMixin.deleteSession;
|
|
@@ -1384,10 +1422,12 @@ class ApiClient {
|
|
|
1384
1422
|
shareSession = branchesMixin.shareSession;
|
|
1385
1423
|
syncSession = branchesMixin.syncSession;
|
|
1386
1424
|
getSessionGoal = goalsMixin.getSessionGoal;
|
|
1425
|
+
listGoals = goalsMixin.listGoals;
|
|
1387
1426
|
createSessionGoal = goalsMixin.createSessionGoal;
|
|
1388
1427
|
updateGoal = goalsMixin.updateGoal;
|
|
1389
1428
|
addGoalTasks = goalsMixin.addGoalTasks;
|
|
1390
1429
|
updateGoalTask = goalsMixin.updateGoalTask;
|
|
1430
|
+
deleteGoalTask = goalsMixin.deleteGoalTask;
|
|
1391
1431
|
startGoal = goalsMixin.startGoal;
|
|
1392
1432
|
listSessionSubagents = goalsMixin.listSessionSubagents;
|
|
1393
1433
|
approveToolCall = approvalMixin.approveToolCall;
|
|
@@ -1421,6 +1461,8 @@ class ApiClient {
|
|
|
1421
1461
|
pollOpenAIDeviceFlow = authMixin.pollOpenAIDeviceFlow;
|
|
1422
1462
|
startCopilotDeviceFlow = authMixin.startCopilotDeviceFlow;
|
|
1423
1463
|
pollCopilotDeviceFlow = authMixin.pollCopilotDeviceFlow;
|
|
1464
|
+
startKimiDeviceFlow = authMixin.startKimiDeviceFlow;
|
|
1465
|
+
pollKimiDeviceFlow = authMixin.pollKimiDeviceFlow;
|
|
1424
1466
|
getCopilotAuthMethods = authMixin.getCopilotAuthMethods;
|
|
1425
1467
|
saveCopilotToken = authMixin.saveCopilotToken;
|
|
1426
1468
|
importCopilotTokenFromGh = authMixin.importCopilotTokenFromGh;
|
|
@@ -2685,7 +2727,7 @@ function useCreateGitBranch() {
|
|
|
2685
2727
|
});
|
|
2686
2728
|
}
|
|
2687
2729
|
// src/hooks/useMessages.ts
|
|
2688
|
-
import { useQuery as
|
|
2730
|
+
import { useQuery as useQuery6, useMutation as useMutation4, useQueryClient as useQueryClient4 } from "@tanstack/react-query";
|
|
2689
2731
|
|
|
2690
2732
|
// src/hooks/useQueueState.ts
|
|
2691
2733
|
import { useQuery as useQuery4 } from "@tanstack/react-query";
|
|
@@ -2763,17 +2805,19 @@ function useMessageQueuePosition(sessionId, messageId) {
|
|
|
2763
2805
|
import {
|
|
2764
2806
|
useInfiniteQuery,
|
|
2765
2807
|
useMutation as useMutation3,
|
|
2808
|
+
useQuery as useQuery5,
|
|
2766
2809
|
useQueryClient as useQueryClient3
|
|
2767
2810
|
} from "@tanstack/react-query";
|
|
2768
2811
|
import { useMemo as useMemo2 } from "react";
|
|
2769
2812
|
var SESSIONS_PAGE_SIZE = 50;
|
|
2770
2813
|
var sessionsQueryKey = ["sessions", "list"];
|
|
2771
|
-
function useSessionsInfinite() {
|
|
2814
|
+
function useSessionsInfinite(sessionType) {
|
|
2772
2815
|
return useInfiniteQuery({
|
|
2773
|
-
queryKey: sessionsQueryKey,
|
|
2816
|
+
queryKey: sessionType ? [...sessionsQueryKey, sessionType] : sessionsQueryKey,
|
|
2774
2817
|
queryFn: ({ pageParam = 0 }) => apiClient.getSessionsPage({
|
|
2775
2818
|
limit: SESSIONS_PAGE_SIZE,
|
|
2776
|
-
offset: pageParam
|
|
2819
|
+
offset: pageParam,
|
|
2820
|
+
sessionType
|
|
2777
2821
|
}),
|
|
2778
2822
|
getNextPageParam: (lastPage) => lastPage.nextOffset ?? undefined,
|
|
2779
2823
|
initialPageParam: 0,
|
|
@@ -2782,8 +2826,8 @@ function useSessionsInfinite() {
|
|
|
2782
2826
|
refetchOnWindowFocus: false
|
|
2783
2827
|
});
|
|
2784
2828
|
}
|
|
2785
|
-
function useSessions() {
|
|
2786
|
-
const query = useSessionsInfinite();
|
|
2829
|
+
function useSessions(sessionType) {
|
|
2830
|
+
const query = useSessionsInfinite(sessionType);
|
|
2787
2831
|
const data = useMemo2(() => {
|
|
2788
2832
|
if (!query.data?.pages)
|
|
2789
2833
|
return [];
|
|
@@ -2801,7 +2845,14 @@ function useSessions() {
|
|
|
2801
2845
|
}
|
|
2802
2846
|
function useSession(sessionId) {
|
|
2803
2847
|
const { data: sessions } = useSessions();
|
|
2804
|
-
|
|
2848
|
+
const listed = sessions?.find((s) => s.id === sessionId);
|
|
2849
|
+
const { data: detail } = useQuery5({
|
|
2850
|
+
queryKey: ["session", sessionId],
|
|
2851
|
+
queryFn: () => apiClient.getSession(sessionId),
|
|
2852
|
+
enabled: Boolean(sessionId) && !listed,
|
|
2853
|
+
staleTime: 15000
|
|
2854
|
+
});
|
|
2855
|
+
return listed ?? detail;
|
|
2805
2856
|
}
|
|
2806
2857
|
function useCreateSession() {
|
|
2807
2858
|
const queryClient = useQueryClient3();
|
|
@@ -2894,7 +2945,7 @@ function useDeleteSession() {
|
|
|
2894
2945
|
// src/hooks/useMessages.ts
|
|
2895
2946
|
function useMessages(sessionId, options = {}) {
|
|
2896
2947
|
const { enabled = true, staleTime = 15000 } = options;
|
|
2897
|
-
return
|
|
2948
|
+
return useQuery6({
|
|
2898
2949
|
queryKey: ["messages", sessionId],
|
|
2899
2950
|
queryFn: () => {
|
|
2900
2951
|
if (!sessionId) {
|
|
@@ -4405,7 +4456,9 @@ ${bestEffortUnescapeJsonString(rawTail)}`;
|
|
|
4405
4456
|
}
|
|
4406
4457
|
queryClient.invalidateQueries({ queryKey: ["messages", sessionId] });
|
|
4407
4458
|
queryClient.invalidateQueries({ queryKey: sessionsQueryKey });
|
|
4459
|
+
queryClient.invalidateQueries({ queryKey: ["session", sessionId] });
|
|
4408
4460
|
queryClient.invalidateQueries({ queryKey: ["goal", sessionId] });
|
|
4461
|
+
queryClient.invalidateQueries({ queryKey: ["goals", "project"] });
|
|
4409
4462
|
queryClient.invalidateQueries({ queryKey: ["subagents", sessionId] });
|
|
4410
4463
|
break;
|
|
4411
4464
|
}
|
|
@@ -4536,6 +4589,7 @@ ${bestEffortUnescapeJsonString(rawTail)}`;
|
|
|
4536
4589
|
}
|
|
4537
4590
|
case "goal.updated": {
|
|
4538
4591
|
queryClient.invalidateQueries({ queryKey: ["goal", sessionId] });
|
|
4592
|
+
queryClient.invalidateQueries({ queryKey: ["goals", "project"] });
|
|
4539
4593
|
queryClient.invalidateQueries({
|
|
4540
4594
|
queryKey: ["subagents", sessionId]
|
|
4541
4595
|
});
|
|
@@ -4558,6 +4612,7 @@ ${bestEffortUnescapeJsonString(rawTail)}`;
|
|
|
4558
4612
|
if (now - lastSessionInvalidation >= 2000) {
|
|
4559
4613
|
lastSessionInvalidation = now;
|
|
4560
4614
|
queryClient.invalidateQueries({ queryKey: sessionsQueryKey });
|
|
4615
|
+
queryClient.invalidateQueries({ queryKey: ["session", sessionId] });
|
|
4561
4616
|
}
|
|
4562
4617
|
}
|
|
4563
4618
|
});
|
|
@@ -5910,10 +5965,10 @@ function useFileUpload(options = {}) {
|
|
|
5910
5965
|
};
|
|
5911
5966
|
}
|
|
5912
5967
|
// src/hooks/useSessionFiles.ts
|
|
5913
|
-
import { useQuery as
|
|
5968
|
+
import { useQuery as useQuery7 } from "@tanstack/react-query";
|
|
5914
5969
|
function useSessionFiles(sessionId, enabled = true) {
|
|
5915
5970
|
const isExpanded = useSessionFilesStore((state) => state.isExpanded);
|
|
5916
|
-
return
|
|
5971
|
+
return useQuery7({
|
|
5917
5972
|
queryKey: ["session", sessionId, "files"],
|
|
5918
5973
|
queryFn: () => sessionId ? apiClient.getSessionFiles(sessionId) : null,
|
|
5919
5974
|
enabled: !!sessionId && enabled,
|
|
@@ -5923,7 +5978,7 @@ function useSessionFiles(sessionId, enabled = true) {
|
|
|
5923
5978
|
});
|
|
5924
5979
|
}
|
|
5925
5980
|
// src/hooks/useBranch.ts
|
|
5926
|
-
import { useQuery as
|
|
5981
|
+
import { useQuery as useQuery8, useMutation as useMutation5, useQueryClient as useQueryClient7 } from "@tanstack/react-query";
|
|
5927
5982
|
function useCreateBranch(sessionId) {
|
|
5928
5983
|
const queryClient = useQueryClient7();
|
|
5929
5984
|
return useMutation5({
|
|
@@ -5943,7 +5998,7 @@ function useCreateBranch(sessionId) {
|
|
|
5943
5998
|
});
|
|
5944
5999
|
}
|
|
5945
6000
|
function useBranches(sessionId) {
|
|
5946
|
-
return
|
|
6001
|
+
return useQuery8({
|
|
5947
6002
|
queryKey: ["branches", sessionId],
|
|
5948
6003
|
queryFn: () => {
|
|
5949
6004
|
if (!sessionId)
|
|
@@ -5954,7 +6009,7 @@ function useBranches(sessionId) {
|
|
|
5954
6009
|
});
|
|
5955
6010
|
}
|
|
5956
6011
|
function useParentSession(sessionId) {
|
|
5957
|
-
return
|
|
6012
|
+
return useQuery8({
|
|
5958
6013
|
queryKey: ["parentSession", sessionId],
|
|
5959
6014
|
queryFn: () => {
|
|
5960
6015
|
if (!sessionId)
|
|
@@ -5965,11 +6020,12 @@ function useParentSession(sessionId) {
|
|
|
5965
6020
|
});
|
|
5966
6021
|
}
|
|
5967
6022
|
// src/hooks/useGoals.ts
|
|
5968
|
-
import { useMutation as useMutation6, useQuery as
|
|
6023
|
+
import { useMutation as useMutation6, useQuery as useQuery9, useQueryClient as useQueryClient8 } from "@tanstack/react-query";
|
|
5969
6024
|
var goalQueryKey = (sessionId) => [
|
|
5970
6025
|
"goal",
|
|
5971
6026
|
sessionId
|
|
5972
6027
|
];
|
|
6028
|
+
var projectGoalsQueryKey = ["goals", "project"];
|
|
5973
6029
|
var subagentsQueryKey = (sessionId) => [
|
|
5974
6030
|
"subagents",
|
|
5975
6031
|
sessionId
|
|
@@ -5978,9 +6034,36 @@ function useOttoEnabled() {
|
|
|
5978
6034
|
const { data: config2 } = useConfig();
|
|
5979
6035
|
return config2?.defaults?.ottoEnabled ?? true;
|
|
5980
6036
|
}
|
|
6037
|
+
function useProjectGoals() {
|
|
6038
|
+
const ottoEnabled = useOttoEnabled();
|
|
6039
|
+
return useQuery9({
|
|
6040
|
+
queryKey: projectGoalsQueryKey,
|
|
6041
|
+
queryFn: () => apiClient.listGoals(),
|
|
6042
|
+
enabled: ottoEnabled,
|
|
6043
|
+
refetchInterval: 1e4
|
|
6044
|
+
});
|
|
6045
|
+
}
|
|
6046
|
+
function applyGoalToProjectCache(queryClient, goal) {
|
|
6047
|
+
queryClient.setQueryData(projectGoalsQueryKey, (old) => old ? { goals: old.goals.map((g) => g.id === goal.id ? goal : g) } : old);
|
|
6048
|
+
queryClient.invalidateQueries({ queryKey: projectGoalsQueryKey });
|
|
6049
|
+
}
|
|
6050
|
+
function useAddProjectGoalTasks() {
|
|
6051
|
+
const queryClient = useQueryClient8();
|
|
6052
|
+
return useMutation6({
|
|
6053
|
+
mutationFn: (input) => apiClient.addGoalTasks(input.goalId, input.tasks),
|
|
6054
|
+
onSuccess: ({ goal }) => applyGoalToProjectCache(queryClient, goal)
|
|
6055
|
+
});
|
|
6056
|
+
}
|
|
6057
|
+
function useDeleteProjectGoalTask() {
|
|
6058
|
+
const queryClient = useQueryClient8();
|
|
6059
|
+
return useMutation6({
|
|
6060
|
+
mutationFn: (input) => apiClient.deleteGoalTask(input.goalId, input.taskId),
|
|
6061
|
+
onSuccess: ({ goal }) => applyGoalToProjectCache(queryClient, goal)
|
|
6062
|
+
});
|
|
6063
|
+
}
|
|
5981
6064
|
function useSessionGoal(sessionId) {
|
|
5982
6065
|
const ottoEnabled = useOttoEnabled();
|
|
5983
|
-
return
|
|
6066
|
+
return useQuery9({
|
|
5984
6067
|
queryKey: goalQueryKey(sessionId),
|
|
5985
6068
|
queryFn: () => {
|
|
5986
6069
|
if (!sessionId)
|
|
@@ -6013,6 +6096,7 @@ function useUpdateGoal(sessionId) {
|
|
|
6013
6096
|
}),
|
|
6014
6097
|
onSuccess: () => {
|
|
6015
6098
|
queryClient.invalidateQueries({ queryKey: goalQueryKey(sessionId) });
|
|
6099
|
+
queryClient.invalidateQueries({ queryKey: projectGoalsQueryKey });
|
|
6016
6100
|
}
|
|
6017
6101
|
});
|
|
6018
6102
|
}
|
|
@@ -6022,6 +6106,7 @@ function useAddGoalTasks(sessionId) {
|
|
|
6022
6106
|
mutationFn: (input) => apiClient.addGoalTasks(input.goalId, input.tasks),
|
|
6023
6107
|
onSuccess: () => {
|
|
6024
6108
|
queryClient.invalidateQueries({ queryKey: goalQueryKey(sessionId) });
|
|
6109
|
+
queryClient.invalidateQueries({ queryKey: projectGoalsQueryKey });
|
|
6025
6110
|
}
|
|
6026
6111
|
});
|
|
6027
6112
|
}
|
|
@@ -6035,11 +6120,12 @@ function useUpdateGoalTask(sessionId) {
|
|
|
6035
6120
|
}),
|
|
6036
6121
|
onSuccess: () => {
|
|
6037
6122
|
queryClient.invalidateQueries({ queryKey: goalQueryKey(sessionId) });
|
|
6123
|
+
queryClient.invalidateQueries({ queryKey: projectGoalsQueryKey });
|
|
6038
6124
|
}
|
|
6039
6125
|
});
|
|
6040
6126
|
}
|
|
6041
6127
|
function useSessionSubagents(sessionId, status) {
|
|
6042
|
-
return
|
|
6128
|
+
return useQuery9({
|
|
6043
6129
|
queryKey: [...subagentsQueryKey(sessionId), status ?? "all"],
|
|
6044
6130
|
queryFn: () => {
|
|
6045
6131
|
if (!sessionId)
|
|
@@ -6059,6 +6145,8 @@ function useStartGoal(sessionId) {
|
|
|
6059
6145
|
mutationFn: (input) => apiClient.startGoal(input.goalId),
|
|
6060
6146
|
onSuccess: () => {
|
|
6061
6147
|
queryClient.invalidateQueries({ queryKey: goalQueryKey(sessionId) });
|
|
6148
|
+
queryClient.invalidateQueries({ queryKey: projectGoalsQueryKey });
|
|
6149
|
+
queryClient.invalidateQueries({ queryKey: ["sessions", "list"] });
|
|
6062
6150
|
if (sessionId) {
|
|
6063
6151
|
queryClient.invalidateQueries({ queryKey: ["messages", sessionId] });
|
|
6064
6152
|
}
|
|
@@ -6066,7 +6154,7 @@ function useStartGoal(sessionId) {
|
|
|
6066
6154
|
});
|
|
6067
6155
|
}
|
|
6068
6156
|
// src/hooks/useResearch.ts
|
|
6069
|
-
import { useQuery as
|
|
6157
|
+
import { useQuery as useQuery10, useMutation as useMutation7, useQueryClient as useQueryClient9 } from "@tanstack/react-query";
|
|
6070
6158
|
import {
|
|
6071
6159
|
createResearchSession as apiCreateResearchSession,
|
|
6072
6160
|
deleteResearchSession as apiDeleteResearchSession,
|
|
@@ -6162,7 +6250,7 @@ class ResearchApiClient {
|
|
|
6162
6250
|
}
|
|
6163
6251
|
var researchApi = new ResearchApiClient;
|
|
6164
6252
|
function useResearchSessions(parentSessionId, enabled = true) {
|
|
6165
|
-
return
|
|
6253
|
+
return useQuery10({
|
|
6166
6254
|
queryKey: ["research", "sessions", parentSessionId],
|
|
6167
6255
|
queryFn: () => researchApi.listResearchSessions(parentSessionId),
|
|
6168
6256
|
enabled: !!parentSessionId && enabled,
|
|
@@ -6511,9 +6599,9 @@ function useOttoRouterBalance(providerName) {
|
|
|
6511
6599
|
};
|
|
6512
6600
|
}
|
|
6513
6601
|
// src/hooks/useShareStatus.ts
|
|
6514
|
-
import { useQuery as
|
|
6602
|
+
import { useQuery as useQuery11 } from "@tanstack/react-query";
|
|
6515
6603
|
function useShareStatus(sessionId) {
|
|
6516
|
-
const { data, isLoading, error } =
|
|
6604
|
+
const { data, isLoading, error } = useQuery11({
|
|
6517
6605
|
queryKey: ["share-status", sessionId],
|
|
6518
6606
|
queryFn: () => apiClient.getShareStatus(sessionId),
|
|
6519
6607
|
enabled: !!sessionId,
|
|
@@ -6947,6 +7035,13 @@ function useAuthStatus() {
|
|
|
6947
7035
|
}
|
|
6948
7036
|
return result;
|
|
6949
7037
|
}, [fetchAuthStatus]);
|
|
7038
|
+
const pollKimiDeviceFlow = useCallback8(async (sessionId) => {
|
|
7039
|
+
const result = await apiClient.pollKimiDeviceFlow(sessionId);
|
|
7040
|
+
if (result.status === "complete") {
|
|
7041
|
+
await fetchAuthStatus();
|
|
7042
|
+
}
|
|
7043
|
+
return result;
|
|
7044
|
+
}, [fetchAuthStatus]);
|
|
6950
7045
|
const saveCopilotToken = useCallback8(async (token) => {
|
|
6951
7046
|
setLoading(true);
|
|
6952
7047
|
setError(null);
|
|
@@ -6996,6 +7091,8 @@ function useAuthStatus() {
|
|
|
6996
7091
|
pollOpenAIDeviceFlow,
|
|
6997
7092
|
startCopilotDeviceFlow: apiClient.startCopilotDeviceFlow.bind(apiClient),
|
|
6998
7093
|
pollCopilotDeviceFlow,
|
|
7094
|
+
startKimiDeviceFlow: apiClient.startKimiDeviceFlow.bind(apiClient),
|
|
7095
|
+
pollKimiDeviceFlow,
|
|
6999
7096
|
getCopilotAuthMethods: apiClient.getCopilotAuthMethods.bind(apiClient),
|
|
7000
7097
|
saveCopilotToken,
|
|
7001
7098
|
importCopilotTokenFromGh,
|
|
@@ -7003,7 +7100,7 @@ function useAuthStatus() {
|
|
|
7003
7100
|
};
|
|
7004
7101
|
}
|
|
7005
7102
|
// src/hooks/useTunnel.ts
|
|
7006
|
-
import { useQuery as
|
|
7103
|
+
import { useQuery as useQuery12, useMutation as useMutation8, useQueryClient as useQueryClient11 } from "@tanstack/react-query";
|
|
7007
7104
|
import { useEffect as useEffect14, useCallback as useCallback9, useRef as useRef6 } from "react";
|
|
7008
7105
|
import {
|
|
7009
7106
|
client as client2,
|
|
@@ -7051,7 +7148,7 @@ function useTunnelStatus() {
|
|
|
7051
7148
|
const setStatus = useTunnelStore((s) => s.setStatus);
|
|
7052
7149
|
const setUrl = useTunnelStore((s) => s.setUrl);
|
|
7053
7150
|
const setError = useTunnelStore((s) => s.setError);
|
|
7054
|
-
const query =
|
|
7151
|
+
const query = useQuery12({
|
|
7055
7152
|
queryKey: ["tunnel", "status"],
|
|
7056
7153
|
queryFn: fetchTunnelStatus,
|
|
7057
7154
|
refetchInterval: 3000,
|
|
@@ -7114,7 +7211,7 @@ function useStopTunnel() {
|
|
|
7114
7211
|
function useTunnelQr() {
|
|
7115
7212
|
const url = useTunnelStore((s) => s.url);
|
|
7116
7213
|
const setQrCode = useTunnelStore((s) => s.setQrCode);
|
|
7117
|
-
const query =
|
|
7214
|
+
const query = useQuery12({
|
|
7118
7215
|
queryKey: ["tunnel", "qr", url],
|
|
7119
7216
|
queryFn: fetchTunnelQr,
|
|
7120
7217
|
enabled: !!url
|
|
@@ -7227,9 +7324,9 @@ function useProviderUsage(provider, authType) {
|
|
|
7227
7324
|
};
|
|
7228
7325
|
}
|
|
7229
7326
|
// src/hooks/useFileBrowser.ts
|
|
7230
|
-
import { useQuery as
|
|
7327
|
+
import { useQuery as useQuery13 } from "@tanstack/react-query";
|
|
7231
7328
|
function useFileTree(dirPath, enabled = true) {
|
|
7232
|
-
return
|
|
7329
|
+
return useQuery13({
|
|
7233
7330
|
queryKey: ["files", "tree", dirPath],
|
|
7234
7331
|
queryFn: () => apiClient.getFileTree(dirPath),
|
|
7235
7332
|
enabled,
|
|
@@ -7238,7 +7335,7 @@ function useFileTree(dirPath, enabled = true) {
|
|
|
7238
7335
|
});
|
|
7239
7336
|
}
|
|
7240
7337
|
function useFileContent(filePath) {
|
|
7241
|
-
return
|
|
7338
|
+
return useQuery13({
|
|
7242
7339
|
queryKey: ["files", "read", filePath],
|
|
7243
7340
|
queryFn: () => filePath ? apiClient.readFileContent(filePath) : null,
|
|
7244
7341
|
enabled: !!filePath,
|
|
@@ -7247,7 +7344,7 @@ function useFileContent(filePath) {
|
|
|
7247
7344
|
});
|
|
7248
7345
|
}
|
|
7249
7346
|
function useGitDiffFullFile(file, staged = false, enabled = false) {
|
|
7250
|
-
return
|
|
7347
|
+
return useQuery13({
|
|
7251
7348
|
queryKey: ["git", "diff", "fullFile", file, staged],
|
|
7252
7349
|
queryFn: () => file ? apiClient.getGitDiffFullFile(file, staged) : null,
|
|
7253
7350
|
enabled: enabled && !!file,
|
|
@@ -7256,7 +7353,7 @@ function useGitDiffFullFile(file, staged = false, enabled = false) {
|
|
|
7256
7353
|
});
|
|
7257
7354
|
}
|
|
7258
7355
|
// src/hooks/useMCP.ts
|
|
7259
|
-
import { useQuery as
|
|
7356
|
+
import { useQuery as useQuery14, useMutation as useMutation9, useQueryClient as useQueryClient12 } from "@tanstack/react-query";
|
|
7260
7357
|
import { useEffect as useEffect16, useRef as useRef8, useCallback as useCallback11 } from "react";
|
|
7261
7358
|
import {
|
|
7262
7359
|
listMcpServers,
|
|
@@ -7271,7 +7368,7 @@ import {
|
|
|
7271
7368
|
} from "@ottocode/api";
|
|
7272
7369
|
function useMCPServers() {
|
|
7273
7370
|
const setServers = useMCPStore((s) => s.setServers);
|
|
7274
|
-
const query =
|
|
7371
|
+
const query = useQuery14({
|
|
7275
7372
|
queryKey: ["mcp", "servers"],
|
|
7276
7373
|
queryFn: async () => {
|
|
7277
7374
|
const { data } = await listMcpServers();
|
|
@@ -7404,7 +7501,7 @@ function useRevokeMCPAuth() {
|
|
|
7404
7501
|
});
|
|
7405
7502
|
}
|
|
7406
7503
|
function useMCPAuthStatus(name) {
|
|
7407
|
-
return
|
|
7504
|
+
return useQuery14({
|
|
7408
7505
|
queryKey: ["mcp", "auth", name],
|
|
7409
7506
|
queryFn: async () => {
|
|
7410
7507
|
if (!name)
|
|
@@ -7465,12 +7562,12 @@ function useCopilotDevicePoller() {
|
|
|
7465
7562
|
return copilotDevice;
|
|
7466
7563
|
}
|
|
7467
7564
|
// src/hooks/useSkills.ts
|
|
7468
|
-
import { useMutation as useMutation10, useQuery as
|
|
7565
|
+
import { useMutation as useMutation10, useQuery as useQuery15, useQueryClient as useQueryClient13 } from "@tanstack/react-query";
|
|
7469
7566
|
import { useEffect as useEffect17 } from "react";
|
|
7470
7567
|
function useSkills(options = {}) {
|
|
7471
7568
|
const enabled = options.enabled ?? true;
|
|
7472
7569
|
const setSkillsConfig = useSkillsStore((s) => s.setSkillsConfig);
|
|
7473
|
-
const query =
|
|
7570
|
+
const query = useQuery15({
|
|
7474
7571
|
queryKey: ["skills"],
|
|
7475
7572
|
queryFn: async () => {
|
|
7476
7573
|
return apiClient.getSkillsConfig();
|
|
@@ -7507,7 +7604,7 @@ function useUpdateSkillsConfig() {
|
|
|
7507
7604
|
});
|
|
7508
7605
|
}
|
|
7509
7606
|
function useSkillDetail(name) {
|
|
7510
|
-
return
|
|
7607
|
+
return useQuery15({
|
|
7511
7608
|
queryKey: ["skills", name],
|
|
7512
7609
|
queryFn: async () => {
|
|
7513
7610
|
if (!name)
|
|
@@ -7518,7 +7615,7 @@ function useSkillDetail(name) {
|
|
|
7518
7615
|
});
|
|
7519
7616
|
}
|
|
7520
7617
|
function useSkillFiles(name) {
|
|
7521
|
-
return
|
|
7618
|
+
return useQuery15({
|
|
7522
7619
|
queryKey: ["skills", name, "files"],
|
|
7523
7620
|
queryFn: async () => {
|
|
7524
7621
|
if (!name)
|
|
@@ -7529,7 +7626,7 @@ function useSkillFiles(name) {
|
|
|
7529
7626
|
});
|
|
7530
7627
|
}
|
|
7531
7628
|
function useSkillFileContent(name, filePath) {
|
|
7532
|
-
return
|
|
7629
|
+
return useQuery15({
|
|
7533
7630
|
queryKey: ["skills", name, "files", filePath],
|
|
7534
7631
|
queryFn: async () => {
|
|
7535
7632
|
if (!name || !filePath)
|
|
@@ -7541,7 +7638,7 @@ function useSkillFileContent(name, filePath) {
|
|
|
7541
7638
|
}
|
|
7542
7639
|
// src/hooks/useAgents.ts
|
|
7543
7640
|
import { useEffect as useEffect18 } from "react";
|
|
7544
|
-
import { useMutation as useMutation11, useQuery as
|
|
7641
|
+
import { useMutation as useMutation11, useQuery as useQuery16, useQueryClient as useQueryClient14 } from "@tanstack/react-query";
|
|
7545
7642
|
|
|
7546
7643
|
// src/stores/agentsStore.ts
|
|
7547
7644
|
import { create as create22 } from "zustand";
|
|
@@ -7616,7 +7713,7 @@ function useAgentDetails(options = {}) {
|
|
|
7616
7713
|
const setAgents = useAgentsStore((s) => s.setAgents);
|
|
7617
7714
|
const selectedAgent = useAgentsStore((s) => s.selectedAgent);
|
|
7618
7715
|
const selectAgent = useAgentsStore((s) => s.selectAgent);
|
|
7619
|
-
const query =
|
|
7716
|
+
const query = useQuery16({
|
|
7620
7717
|
queryKey: ["config", "agents"],
|
|
7621
7718
|
queryFn: () => apiClient.getAgentDetails(),
|
|
7622
7719
|
enabled,
|
|
@@ -7634,7 +7731,7 @@ function useAgentDetails(options = {}) {
|
|
|
7634
7731
|
return query;
|
|
7635
7732
|
}
|
|
7636
7733
|
function useAgent(agentName) {
|
|
7637
|
-
return
|
|
7734
|
+
return useQuery16({
|
|
7638
7735
|
queryKey: ["config", "agents", agentName],
|
|
7639
7736
|
queryFn: async () => {
|
|
7640
7737
|
if (!agentName)
|
|
@@ -7646,7 +7743,7 @@ function useAgent(agentName) {
|
|
|
7646
7743
|
});
|
|
7647
7744
|
}
|
|
7648
7745
|
function useMentionAgents(options = {}) {
|
|
7649
|
-
return
|
|
7746
|
+
return useQuery16({
|
|
7650
7747
|
queryKey: ["config", "agents"],
|
|
7651
7748
|
queryFn: () => apiClient.getAgentDetails(),
|
|
7652
7749
|
enabled: options.enabled ?? true,
|
|
@@ -7657,7 +7754,7 @@ function useConfigTools(options = {}) {
|
|
|
7657
7754
|
const managerOpen = useAgentsStore((s) => s.isManagerOpen);
|
|
7658
7755
|
const createOpen = useAgentsStore((s) => s.isCreateModalOpen);
|
|
7659
7756
|
const enabled = options.enabled ?? (managerOpen || createOpen);
|
|
7660
|
-
return
|
|
7757
|
+
return useQuery16({
|
|
7661
7758
|
queryKey: ["config", "tools"],
|
|
7662
7759
|
queryFn: () => apiClient.getConfigTools(),
|
|
7663
7760
|
enabled,
|
|
@@ -7751,7 +7848,7 @@ function useChatComposer({
|
|
|
7751
7848
|
setProvider(selectedAgent?.provider ?? config2.defaults.provider ?? "");
|
|
7752
7849
|
setModel(selectedAgent?.model ?? config2.defaults.model ?? "");
|
|
7753
7850
|
}, [sessionId, agentDetails?.agents, config2, defaultAgent]);
|
|
7754
|
-
const agentNames = useMemo4(() => agentDetails?.agents.length ? agentDetails.agents.map((agentDetail) => agentDetail.name) : config2?.agents ?? [], [agentDetails?.agents, config2?.agents]);
|
|
7851
|
+
const agentNames = useMemo4(() => ((agentDetails?.agents.length) ? agentDetails.agents.map((agentDetail) => agentDetail.name) : config2?.agents ?? []).filter((name) => name !== "otto"), [agentDetails?.agents, config2?.agents]);
|
|
7755
7852
|
const selectedModel = useMemo4(() => allModels?.[provider]?.models?.find((m) => m.id === model), [allModels, provider, model]);
|
|
7756
7853
|
const persist2 = useCallback12(async (update) => {
|
|
7757
7854
|
if (!sessionId)
|
|
@@ -7873,8 +7970,103 @@ function useContainerWidth(ref) {
|
|
|
7873
7970
|
}, [ref]);
|
|
7874
7971
|
return width;
|
|
7875
7972
|
}
|
|
7973
|
+
// src/hooks/useEdgeHover.ts
|
|
7974
|
+
import { useEffect as useEffect21, useRef as useRef10, useState as useState9 } from "react";
|
|
7975
|
+
var HOVER_SHOW_DELAY_MS = 260;
|
|
7976
|
+
var HOVER_HIDE_DELAY_MS = 120;
|
|
7977
|
+
function useEdgeHover({
|
|
7978
|
+
side,
|
|
7979
|
+
enabled,
|
|
7980
|
+
hoverRatio,
|
|
7981
|
+
activeWidth,
|
|
7982
|
+
ignoreSelector
|
|
7983
|
+
}) {
|
|
7984
|
+
const [isVisible, setIsVisible] = useState9(false);
|
|
7985
|
+
const [isHoverPending, setIsHoverPending] = useState9(false);
|
|
7986
|
+
const isVisibleRef = useRef10(false);
|
|
7987
|
+
const showTimeoutRef = useRef10(null);
|
|
7988
|
+
const hideTimeoutRef = useRef10(null);
|
|
7989
|
+
useEffect21(() => {
|
|
7990
|
+
const setVisible = (visible) => {
|
|
7991
|
+
isVisibleRef.current = visible;
|
|
7992
|
+
setIsVisible(visible);
|
|
7993
|
+
};
|
|
7994
|
+
const clearHoverTimeouts = () => {
|
|
7995
|
+
if (showTimeoutRef.current !== null) {
|
|
7996
|
+
window.clearTimeout(showTimeoutRef.current);
|
|
7997
|
+
showTimeoutRef.current = null;
|
|
7998
|
+
}
|
|
7999
|
+
if (hideTimeoutRef.current !== null) {
|
|
8000
|
+
window.clearTimeout(hideTimeoutRef.current);
|
|
8001
|
+
hideTimeoutRef.current = null;
|
|
8002
|
+
}
|
|
8003
|
+
};
|
|
8004
|
+
const scheduleVisible = (visible) => {
|
|
8005
|
+
if (isVisibleRef.current === visible) {
|
|
8006
|
+
setIsHoverPending(false);
|
|
8007
|
+
return;
|
|
8008
|
+
}
|
|
8009
|
+
setIsHoverPending(visible);
|
|
8010
|
+
const delay = visible ? HOVER_SHOW_DELAY_MS : HOVER_HIDE_DELAY_MS;
|
|
8011
|
+
const targetRef = visible ? showTimeoutRef : hideTimeoutRef;
|
|
8012
|
+
const oppositeRef = visible ? hideTimeoutRef : showTimeoutRef;
|
|
8013
|
+
if (oppositeRef.current !== null) {
|
|
8014
|
+
window.clearTimeout(oppositeRef.current);
|
|
8015
|
+
oppositeRef.current = null;
|
|
8016
|
+
}
|
|
8017
|
+
if (targetRef.current !== null)
|
|
8018
|
+
return;
|
|
8019
|
+
targetRef.current = window.setTimeout(() => {
|
|
8020
|
+
setVisible(visible);
|
|
8021
|
+
setIsHoverPending(false);
|
|
8022
|
+
targetRef.current = null;
|
|
8023
|
+
}, delay);
|
|
8024
|
+
};
|
|
8025
|
+
if (!enabled) {
|
|
8026
|
+
clearHoverTimeouts();
|
|
8027
|
+
setIsHoverPending(false);
|
|
8028
|
+
setVisible(false);
|
|
8029
|
+
return;
|
|
8030
|
+
}
|
|
8031
|
+
const handleMouseMove = (event) => {
|
|
8032
|
+
const target = event.target;
|
|
8033
|
+
if (ignoreSelector && target instanceof Element && target.closest(ignoreSelector)) {
|
|
8034
|
+
clearHoverTimeouts();
|
|
8035
|
+
setIsHoverPending(false);
|
|
8036
|
+
setVisible(false);
|
|
8037
|
+
return;
|
|
8038
|
+
}
|
|
8039
|
+
const triggerWidth = window.innerWidth * hoverRatio;
|
|
8040
|
+
const zoneWidth = isVisibleRef.current && activeWidth ? Math.max(triggerWidth, activeWidth) : triggerWidth;
|
|
8041
|
+
const distance = side === "left" ? event.clientX : window.innerWidth - event.clientX;
|
|
8042
|
+
scheduleVisible(distance <= zoneWidth);
|
|
8043
|
+
};
|
|
8044
|
+
const handleMouseLeave = () => {
|
|
8045
|
+
clearHoverTimeouts();
|
|
8046
|
+
setIsHoverPending(false);
|
|
8047
|
+
setVisible(false);
|
|
8048
|
+
};
|
|
8049
|
+
const handleMouseOut = (event) => {
|
|
8050
|
+
if (!event.relatedTarget) {
|
|
8051
|
+
handleMouseLeave();
|
|
8052
|
+
}
|
|
8053
|
+
};
|
|
8054
|
+
window.addEventListener("mousemove", handleMouseMove);
|
|
8055
|
+
window.addEventListener("mouseout", handleMouseOut);
|
|
8056
|
+
window.addEventListener("blur", handleMouseLeave);
|
|
8057
|
+
document.documentElement.addEventListener("mouseleave", handleMouseLeave);
|
|
8058
|
+
return () => {
|
|
8059
|
+
clearHoverTimeouts();
|
|
8060
|
+
window.removeEventListener("mousemove", handleMouseMove);
|
|
8061
|
+
window.removeEventListener("mouseout", handleMouseOut);
|
|
8062
|
+
window.removeEventListener("blur", handleMouseLeave);
|
|
8063
|
+
document.documentElement.removeEventListener("mouseleave", handleMouseLeave);
|
|
8064
|
+
};
|
|
8065
|
+
}, [enabled, hoverRatio, activeWidth, ignoreSelector, side]);
|
|
8066
|
+
return { isVisible, isHoverPending };
|
|
8067
|
+
}
|
|
7876
8068
|
// src/hooks/useVoiceInput.ts
|
|
7877
|
-
import { useCallback as useCallback14, useEffect as
|
|
8069
|
+
import { useCallback as useCallback14, useEffect as useEffect22, useRef as useRef11, useState as useState10 } from "react";
|
|
7878
8070
|
var TARGET_SAMPLE_RATE = 16000;
|
|
7879
8071
|
var PCM_FRAME_BYTES = 3200;
|
|
7880
8072
|
function getAudioContextConstructor() {
|
|
@@ -7931,22 +8123,22 @@ function useVoiceInput({
|
|
|
7931
8123
|
onNeedsInstall,
|
|
7932
8124
|
lang = "en-US"
|
|
7933
8125
|
} = {}) {
|
|
7934
|
-
const [isListening, setIsListening] =
|
|
7935
|
-
const [isTranscribing, setIsTranscribing] =
|
|
7936
|
-
const [analyser, setAnalyser] =
|
|
7937
|
-
const [error, setError] =
|
|
7938
|
-
const streamRef =
|
|
7939
|
-
const audioContextRef =
|
|
7940
|
-
const processorRef =
|
|
7941
|
-
const sourceRef =
|
|
7942
|
-
const socketRef =
|
|
7943
|
-
const frameBufferRef =
|
|
7944
|
-
const stoppingRef =
|
|
7945
|
-
const sessionIdRef =
|
|
7946
|
-
const onTranscriptRef =
|
|
7947
|
-
const onErrorRef =
|
|
7948
|
-
const onNeedsInstallRef =
|
|
7949
|
-
|
|
8126
|
+
const [isListening, setIsListening] = useState10(false);
|
|
8127
|
+
const [isTranscribing, setIsTranscribing] = useState10(false);
|
|
8128
|
+
const [analyser, setAnalyser] = useState10(null);
|
|
8129
|
+
const [error, setError] = useState10(null);
|
|
8130
|
+
const streamRef = useRef11(null);
|
|
8131
|
+
const audioContextRef = useRef11(null);
|
|
8132
|
+
const processorRef = useRef11(null);
|
|
8133
|
+
const sourceRef = useRef11(null);
|
|
8134
|
+
const socketRef = useRef11(null);
|
|
8135
|
+
const frameBufferRef = useRef11(new Uint8Array(0));
|
|
8136
|
+
const stoppingRef = useRef11(false);
|
|
8137
|
+
const sessionIdRef = useRef11(null);
|
|
8138
|
+
const onTranscriptRef = useRef11(onTranscript);
|
|
8139
|
+
const onErrorRef = useRef11(onError);
|
|
8140
|
+
const onNeedsInstallRef = useRef11(onNeedsInstall);
|
|
8141
|
+
useEffect22(() => {
|
|
7950
8142
|
onTranscriptRef.current = onTranscript;
|
|
7951
8143
|
onErrorRef.current = onError;
|
|
7952
8144
|
onNeedsInstallRef.current = onNeedsInstall;
|
|
@@ -8157,7 +8349,7 @@ function useVoiceInput({
|
|
|
8157
8349
|
isSupported,
|
|
8158
8350
|
lang
|
|
8159
8351
|
]);
|
|
8160
|
-
|
|
8352
|
+
useEffect22(() => cleanup, [cleanup]);
|
|
8161
8353
|
return {
|
|
8162
8354
|
isListening,
|
|
8163
8355
|
isTranscribing,
|
|
@@ -8169,8 +8361,8 @@ function useVoiceInput({
|
|
|
8169
8361
|
};
|
|
8170
8362
|
}
|
|
8171
8363
|
// src/hooks/useDictationModels.ts
|
|
8172
|
-
import { useCallback as useCallback15, useEffect as
|
|
8173
|
-
import { useMutation as useMutation12, useQuery as
|
|
8364
|
+
import { useCallback as useCallback15, useEffect as useEffect23, useRef as useRef12, useState as useState11 } from "react";
|
|
8365
|
+
import { useMutation as useMutation12, useQuery as useQuery17, useQueryClient as useQueryClient15 } from "@tanstack/react-query";
|
|
8174
8366
|
var DICTATION_STATUS_QUERY_KEY = ["dictation", "status"];
|
|
8175
8367
|
function mergeModelState(current, model) {
|
|
8176
8368
|
if (!current)
|
|
@@ -8192,11 +8384,11 @@ function parseInstallEvent(raw) {
|
|
|
8192
8384
|
}
|
|
8193
8385
|
function useDictationModels() {
|
|
8194
8386
|
const queryClient = useQueryClient15();
|
|
8195
|
-
const eventSourceRef =
|
|
8196
|
-
const [activeInstallModelId, setActiveInstallModelId] =
|
|
8197
|
-
const [installProgress, setInstallProgress] =
|
|
8198
|
-
const [installStreamError, setInstallStreamError] =
|
|
8199
|
-
const statusQuery =
|
|
8387
|
+
const eventSourceRef = useRef12(null);
|
|
8388
|
+
const [activeInstallModelId, setActiveInstallModelId] = useState11(null);
|
|
8389
|
+
const [installProgress, setInstallProgress] = useState11(null);
|
|
8390
|
+
const [installStreamError, setInstallStreamError] = useState11(null);
|
|
8391
|
+
const statusQuery = useQuery17({
|
|
8200
8392
|
queryKey: DICTATION_STATUS_QUERY_KEY,
|
|
8201
8393
|
queryFn: () => apiClient.getDictationStatus(),
|
|
8202
8394
|
refetchInterval: (query) => query.state.data?.models.some((model) => model.installing) ? 1000 : 30000
|
|
@@ -8238,7 +8430,7 @@ function useDictationModels() {
|
|
|
8238
8430
|
});
|
|
8239
8431
|
};
|
|
8240
8432
|
}, [closeInstallStream, queryClient]);
|
|
8241
|
-
|
|
8433
|
+
useEffect23(() => closeInstallStream, [closeInstallStream]);
|
|
8242
8434
|
const installMutation = useMutation12({
|
|
8243
8435
|
mutationFn: (input) => apiClient.installDictationModel(input),
|
|
8244
8436
|
onSuccess: (data) => {
|
|
@@ -8329,6 +8521,7 @@ export {
|
|
|
8329
8521
|
usePushCommits,
|
|
8330
8522
|
usePullChanges,
|
|
8331
8523
|
useProviderUsage,
|
|
8524
|
+
useProjectGoals,
|
|
8332
8525
|
usePreferences,
|
|
8333
8526
|
useParentSession,
|
|
8334
8527
|
useOttoRouterPayments,
|
|
@@ -8358,9 +8551,11 @@ export {
|
|
|
8358
8551
|
useFileTree,
|
|
8359
8552
|
useFileContent,
|
|
8360
8553
|
useExportToSession,
|
|
8554
|
+
useEdgeHover,
|
|
8361
8555
|
useDictationModels,
|
|
8362
8556
|
useDeleteSession,
|
|
8363
8557
|
useDeleteResearchSession,
|
|
8558
|
+
useDeleteProjectGoalTask,
|
|
8364
8559
|
useDeleteFiles,
|
|
8365
8560
|
useDeleteAgent,
|
|
8366
8561
|
useCreateSessionGoal,
|
|
@@ -8384,14 +8579,16 @@ export {
|
|
|
8384
8579
|
useAgentDetails,
|
|
8385
8580
|
useAgent,
|
|
8386
8581
|
useAddRemote,
|
|
8582
|
+
useAddProjectGoalTasks,
|
|
8387
8583
|
useAddMCPServer,
|
|
8388
8584
|
useAddGoalTasks,
|
|
8389
8585
|
subagentsQueryKey,
|
|
8390
8586
|
sessionsQueryKey,
|
|
8587
|
+
projectGoalsQueryKey,
|
|
8391
8588
|
optimisticallyQueueMessage,
|
|
8392
8589
|
normalizeQueueState,
|
|
8393
8590
|
goalQueryKey,
|
|
8394
8591
|
getAgentToolCount
|
|
8395
8592
|
};
|
|
8396
8593
|
|
|
8397
|
-
//# debugId=
|
|
8594
|
+
//# debugId=FCCD29FAF084571164756E2164756E21
|