@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.
Files changed (102) hide show
  1. package/dist/assets/provider-logos.d.ts +1 -0
  2. package/dist/assets/provider-logos.d.ts.map +1 -1
  3. package/dist/components/chat/ChatInput.d.ts +4 -0
  4. package/dist/components/chat/ChatInput.d.ts.map +1 -1
  5. package/dist/components/chat/ChatInputContainer.d.ts +4 -0
  6. package/dist/components/chat/ChatInputContainer.d.ts.map +1 -1
  7. package/dist/components/chat/ConfigModal.d.ts +3 -1
  8. package/dist/components/chat/ConfigModal.d.ts.map +1 -1
  9. package/dist/components/chat/ConfigSelector.d.ts.map +1 -1
  10. package/dist/components/chat/InputApprovalBar.d.ts.map +1 -1
  11. package/dist/components/chat/InputSecureInputBar.d.ts.map +1 -1
  12. package/dist/components/chat/InputSubagentsBar.d.ts.map +1 -1
  13. package/dist/components/chat/InputTodosBar.d.ts.map +1 -1
  14. package/dist/components/chat/NewSessionLanding.d.ts +4 -0
  15. package/dist/components/chat/NewSessionLanding.d.ts.map +1 -1
  16. package/dist/components/chat/input-bar-chrome.d.ts +24 -0
  17. package/dist/components/chat/input-bar-chrome.d.ts.map +1 -0
  18. package/dist/components/common/OttoOIcon.d.ts +8 -0
  19. package/dist/components/common/OttoOIcon.d.ts.map +1 -0
  20. package/dist/components/common/ProviderLogo.d.ts.map +1 -1
  21. package/dist/components/index.d.ts +3 -2
  22. package/dist/components/index.d.ts.map +1 -1
  23. package/dist/components/index.js +4718 -3514
  24. package/dist/components/index.js.map +46 -36
  25. package/dist/components/messages/MessageThreadContainer.d.ts +6 -0
  26. package/dist/components/messages/MessageThreadContainer.d.ts.map +1 -1
  27. package/dist/components/messages/OttoKickoffNotice.d.ts +15 -0
  28. package/dist/components/messages/OttoKickoffNotice.d.ts.map +1 -0
  29. package/dist/components/messages/OttoWakeupNotice.d.ts +12 -0
  30. package/dist/components/messages/OttoWakeupNotice.d.ts.map +1 -0
  31. package/dist/components/messages/UserMessageGroup.d.ts.map +1 -1
  32. package/dist/components/messages/compactActivity.d.ts.map +1 -1
  33. package/dist/components/messages/otto-notice-parsing.d.ts +43 -0
  34. package/dist/components/messages/otto-notice-parsing.d.ts.map +1 -0
  35. package/dist/components/messages/renderers/GoalToolRenderer.d.ts.map +1 -1
  36. package/dist/components/onboarding/OnboardingModal.d.ts.map +1 -1
  37. package/dist/components/onboarding/steps/ProviderSetupStep.d.ts +10 -0
  38. package/dist/components/onboarding/steps/ProviderSetupStep.d.ts.map +1 -1
  39. package/dist/components/otto/OttoGoalBar.d.ts +18 -0
  40. package/dist/components/otto/OttoGoalBar.d.ts.map +1 -0
  41. package/dist/components/otto/OttoSessionRail.d.ts +15 -0
  42. package/dist/components/otto/OttoSessionRail.d.ts.map +1 -0
  43. package/dist/components/otto/OttoSessionView.d.ts +14 -0
  44. package/dist/components/otto/OttoSessionView.d.ts.map +1 -0
  45. package/dist/components/otto/OttoTabBar.d.ts +20 -0
  46. package/dist/components/otto/OttoTabBar.d.ts.map +1 -0
  47. package/dist/components/otto/OttoWorkspace.d.ts +20 -0
  48. package/dist/components/otto/OttoWorkspace.d.ts.map +1 -0
  49. package/dist/components/otto/index.d.ts +7 -0
  50. package/dist/components/otto/index.d.ts.map +1 -0
  51. package/dist/components/sessions/SessionListContainer.d.ts +8 -0
  52. package/dist/components/sessions/SessionListContainer.d.ts.map +1 -1
  53. package/dist/components/subagents/SubagentFloatingViewer.d.ts +3 -2
  54. package/dist/components/subagents/SubagentFloatingViewer.d.ts.map +1 -1
  55. package/dist/components/titlebar/TitleBar.d.ts +48 -0
  56. package/dist/components/titlebar/TitleBar.d.ts.map +1 -0
  57. package/dist/hooks/index.d.ts +1 -0
  58. package/dist/hooks/index.d.ts.map +1 -1
  59. package/dist/hooks/index.js +267 -70
  60. package/dist/hooks/index.js.map +13 -12
  61. package/dist/hooks/useAgents.d.ts.map +1 -1
  62. package/dist/hooks/useAuthStatus.d.ts +5 -0
  63. package/dist/hooks/useAuthStatus.d.ts.map +1 -1
  64. package/dist/hooks/useChatComposer.d.ts.map +1 -1
  65. package/dist/hooks/useEdgeHover.d.ts +26 -0
  66. package/dist/hooks/useEdgeHover.d.ts.map +1 -0
  67. package/dist/hooks/useGoals.d.ts +34 -6
  68. package/dist/hooks/useGoals.d.ts.map +1 -1
  69. package/dist/hooks/useSessionStream.d.ts.map +1 -1
  70. package/dist/hooks/useSessions.d.ts +9 -2
  71. package/dist/hooks/useSessions.d.ts.map +1 -1
  72. package/dist/index.js +4864 -3571
  73. package/dist/index.js.map +48 -38
  74. package/dist/lib/api-client/auth.d.ts +10 -0
  75. package/dist/lib/api-client/auth.d.ts.map +1 -1
  76. package/dist/lib/api-client/goals.d.ts +9 -1
  77. package/dist/lib/api-client/goals.d.ts.map +1 -1
  78. package/dist/lib/api-client/index.d.ts +18 -0
  79. package/dist/lib/api-client/index.d.ts.map +1 -1
  80. package/dist/lib/api-client/sessions.d.ts +2 -0
  81. package/dist/lib/api-client/sessions.d.ts.map +1 -1
  82. package/dist/lib/index.js +45 -3
  83. package/dist/lib/index.js.map +6 -6
  84. package/dist/stores/index.d.ts +1 -1
  85. package/dist/stores/index.d.ts.map +1 -1
  86. package/dist/stores/index.js +57 -56
  87. package/dist/stores/index.js.map +6 -6
  88. package/dist/stores/subagentViewerStore.d.ts +20 -5
  89. package/dist/stores/subagentViewerStore.d.ts.map +1 -1
  90. package/dist/stores/workspaceTabStore.d.ts +14 -0
  91. package/dist/stores/workspaceTabStore.d.ts.map +1 -0
  92. package/dist/types/api.d.ts +2 -2
  93. package/dist/types/api.d.ts.map +1 -1
  94. package/package.json +3 -3
  95. package/dist/components/goals/GoalsSidebar.d.ts +0 -6
  96. package/dist/components/goals/GoalsSidebar.d.ts.map +0 -1
  97. package/dist/components/goals/GoalsSidebarToggle.d.ts +0 -6
  98. package/dist/components/goals/GoalsSidebarToggle.d.ts.map +0 -1
  99. package/dist/components/goals/index.d.ts +0 -3
  100. package/dist/components/goals/index.d.ts.map +0 -1
  101. package/dist/stores/goalsPanelStore.d.ts +0 -9
  102. package/dist/stores/goalsPanelStore.d.ts.map +0 -1
@@ -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 useQuery5, useMutation as useMutation4, useQueryClient as useQueryClient4 } from "@tanstack/react-query";
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
- return sessions?.find((s) => s.id === sessionId);
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 useQuery5({
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 useQuery6 } from "@tanstack/react-query";
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 useQuery6({
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 useQuery7, useMutation as useMutation5, useQueryClient as useQueryClient7 } from "@tanstack/react-query";
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 useQuery7({
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 useQuery7({
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 useQuery8, useQueryClient as useQueryClient8 } from "@tanstack/react-query";
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 useQuery8({
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 useQuery8({
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 useQuery9, useMutation as useMutation7, useQueryClient as useQueryClient9 } from "@tanstack/react-query";
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 useQuery9({
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 useQuery10 } from "@tanstack/react-query";
6602
+ import { useQuery as useQuery11 } from "@tanstack/react-query";
6515
6603
  function useShareStatus(sessionId) {
6516
- const { data, isLoading, error } = useQuery10({
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 useQuery11, useMutation as useMutation8, useQueryClient as useQueryClient11 } from "@tanstack/react-query";
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 = useQuery11({
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 = useQuery11({
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 useQuery12 } from "@tanstack/react-query";
7327
+ import { useQuery as useQuery13 } from "@tanstack/react-query";
7231
7328
  function useFileTree(dirPath, enabled = true) {
7232
- return useQuery12({
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 useQuery12({
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 useQuery12({
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 useQuery13, useMutation as useMutation9, useQueryClient as useQueryClient12 } from "@tanstack/react-query";
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 = useQuery13({
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 useQuery13({
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 useQuery14, useQueryClient as useQueryClient13 } from "@tanstack/react-query";
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 = useQuery14({
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 useQuery14({
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 useQuery14({
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 useQuery14({
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 useQuery15, useQueryClient as useQueryClient14 } from "@tanstack/react-query";
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 = useQuery15({
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 useQuery15({
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 useQuery15({
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 useQuery15({
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 useEffect21, useRef as useRef10, useState as useState9 } from "react";
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] = useState9(false);
7935
- const [isTranscribing, setIsTranscribing] = useState9(false);
7936
- const [analyser, setAnalyser] = useState9(null);
7937
- const [error, setError] = useState9(null);
7938
- const streamRef = useRef10(null);
7939
- const audioContextRef = useRef10(null);
7940
- const processorRef = useRef10(null);
7941
- const sourceRef = useRef10(null);
7942
- const socketRef = useRef10(null);
7943
- const frameBufferRef = useRef10(new Uint8Array(0));
7944
- const stoppingRef = useRef10(false);
7945
- const sessionIdRef = useRef10(null);
7946
- const onTranscriptRef = useRef10(onTranscript);
7947
- const onErrorRef = useRef10(onError);
7948
- const onNeedsInstallRef = useRef10(onNeedsInstall);
7949
- useEffect21(() => {
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
- useEffect21(() => cleanup, [cleanup]);
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 useEffect22, useRef as useRef11, useState as useState10 } from "react";
8173
- import { useMutation as useMutation12, useQuery as useQuery16, useQueryClient as useQueryClient15 } from "@tanstack/react-query";
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 = useRef11(null);
8196
- const [activeInstallModelId, setActiveInstallModelId] = useState10(null);
8197
- const [installProgress, setInstallProgress] = useState10(null);
8198
- const [installStreamError, setInstallStreamError] = useState10(null);
8199
- const statusQuery = useQuery16({
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
- useEffect22(() => closeInstallStream, [closeInstallStream]);
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=37EDDE4EE625A54D64756E2164756E21
8594
+ //# debugId=FCCD29FAF084571164756E2164756E21