@tutti-os/agent-gui 0.0.107 → 0.0.108
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/{AgentGUI-Do6py-T_.d.ts → AgentGUI-CkxdEB8F.d.ts} +6 -3
- package/dist/AgentRichTextReadonly-42TUVYX5.js +18 -0
- package/dist/agent-conversation/index.d.ts +4 -4
- package/dist/agent-conversation/index.js +13 -12
- package/dist/agent-conversation/index.js.map +1 -1
- package/dist/agent-env/index.js +1 -1
- package/dist/agent-gui.d.ts +5 -4
- package/dist/agent-gui.js +27 -25
- package/dist/agent-message-center/index.d.ts +3 -1
- package/dist/agent-message-center/index.js +22 -10
- package/dist/agent-message-center/index.js.map +1 -1
- package/dist/{agentConversationVM-Bf3Zv3iI.d.ts → agentConversationVM-D3Dn2LqN.d.ts} +18 -2
- package/dist/{agentGuiNodeTypes-DbgQBiYz.d.ts → agentGuiNodeTypes-B3N_hJZp.d.ts} +5 -3
- package/dist/agents.d.ts +1 -1
- package/dist/agents.js +1 -1
- package/dist/app/renderer/agentactivity.css +64 -2
- package/dist/app/renderer/assets/icons/agent-vinyl-beta-tag.svg +5 -0
- package/dist/{chunk-OWW7CU4U.js → chunk-25BPR75P.js} +2 -2
- package/dist/{chunk-N4WVVCNI.js → chunk-2QHKXI5N.js} +2 -2
- package/dist/{chunk-KJQERFKX.js → chunk-6CUELYIF.js} +3 -3
- package/dist/chunk-6CUELYIF.js.map +1 -0
- package/dist/{chunk-TKBEVCHG.js → chunk-7BN2WQ2M.js} +32 -2
- package/dist/chunk-7BN2WQ2M.js.map +1 -0
- package/dist/chunk-7KVZPJ3O.js +25 -0
- package/dist/chunk-7KVZPJ3O.js.map +1 -0
- package/dist/{chunk-C35SNDVZ.js → chunk-7OYHDOGG.js} +2 -1
- package/dist/chunk-7OYHDOGG.js.map +1 -0
- package/dist/{chunk-4ZWV57MF.js → chunk-AIZJHA4Q.js} +14 -9
- package/dist/chunk-AIZJHA4Q.js.map +1 -0
- package/dist/{chunk-QY22OBJS.js → chunk-AY5AFMT2.js} +8 -84
- package/dist/chunk-AY5AFMT2.js.map +1 -0
- package/dist/{chunk-V5ROOS2O.js → chunk-BM3CSFWU.js} +22 -6
- package/dist/chunk-BM3CSFWU.js.map +1 -0
- package/dist/{chunk-F7Q7QK42.js → chunk-BRLKORQI.js} +1432 -1902
- package/dist/chunk-BRLKORQI.js.map +1 -0
- package/dist/{chunk-LDZ6C3YV.js → chunk-E74BMFHI.js} +3 -3
- package/dist/chunk-E74BMFHI.js.map +1 -0
- package/dist/{chunk-ZSJBCZUH.js → chunk-EBXOSQ5G.js} +102 -73
- package/dist/chunk-EBXOSQ5G.js.map +1 -0
- package/dist/chunk-J4K7KIFZ.js +75 -0
- package/dist/chunk-J4K7KIFZ.js.map +1 -0
- package/dist/{chunk-UFIEUC3Y.js → chunk-JBX3JPTC.js} +9 -8
- package/dist/chunk-JBX3JPTC.js.map +1 -0
- package/dist/{chunk-4YVKAPKW.js → chunk-JLRPIEIE.js} +2 -17
- package/dist/chunk-JLRPIEIE.js.map +1 -0
- package/dist/{chunk-ZWY32ZKZ.js → chunk-KXZMIZ5H.js} +1269 -728
- package/dist/chunk-KXZMIZ5H.js.map +1 -0
- package/dist/{chunk-4YG7YK7S.js → chunk-L2GENUG3.js} +3 -3
- package/dist/{chunk-J2HG7UCP.js → chunk-OEYXSD3O.js} +3 -3
- package/dist/{chunk-P3CVAWGJ.js → chunk-QTW5CH62.js} +5 -5
- package/dist/{chunk-L3GMMGRS.js → chunk-R2ZADXRB.js} +2 -2
- package/dist/chunk-R7AXDQCA.js +146 -0
- package/dist/chunk-R7AXDQCA.js.map +1 -0
- package/dist/{chunk-7MPN2JGL.js → chunk-U4CVBCHD.js} +37 -119
- package/dist/chunk-U4CVBCHD.js.map +1 -0
- package/dist/{chunk-BXOKBZH4.js → chunk-UFD2QKGC.js} +9 -6
- package/dist/chunk-UFD2QKGC.js.map +1 -0
- package/dist/{chunk-4YCCATI4.js → chunk-USIFGHT3.js} +17 -4
- package/dist/chunk-USIFGHT3.js.map +1 -0
- package/dist/{chunk-7BXWPI4F.js → chunk-VMQNG2KI.js} +13 -1
- package/dist/{chunk-7BXWPI4F.js.map → chunk-VMQNG2KI.js.map} +1 -1
- package/dist/{chunk-SN6UYX54.js → chunk-W6TO6K2X.js} +4 -4
- package/dist/{chunk-UGVI47X6.js → chunk-YNSXUEIR.js} +6 -6
- package/dist/context-mention-palette/index.js +13 -12
- package/dist/{contribution-C6K5YfJ7.d.ts → contribution-C2LDwLA7.d.ts} +3 -2
- package/dist/dock-icons.js +3 -3
- package/dist/i18n/index.d.ts +31 -1
- package/dist/i18n/index.js +2 -2
- package/dist/index.d.ts +8 -7
- package/dist/index.js +27 -25
- package/dist/index.js.map +1 -1
- package/dist/mention-search.js +11 -10
- package/dist/provider-icons.js +1 -1
- package/dist/provider-identity.js +1 -1
- package/dist/{types-CnT8rNUI.d.ts → types-yF_0mrNS.d.ts} +1 -0
- package/dist/workbench/contribution.d.ts +2 -2
- package/dist/workbench/contribution.js +11 -11
- package/dist/workbench/index.d.ts +4 -4
- package/dist/workbench/index.js +22 -28
- package/dist/workbench/launch.d.ts +11 -14
- package/dist/workbench/launch.js +5 -11
- package/dist/workbench/providerCatalog.js +2 -2
- package/dist/workbench/sessionTitle.js +3 -3
- package/dist/workbench/state.d.ts +2 -12
- package/dist/workbench/state.js +3 -9
- package/dist/workspace-agent-generated-files.js +2 -1
- package/dist/workspace-query-cache.d.ts +19 -0
- package/dist/workspace-query-cache.js +7 -0
- package/dist/workspace-query-cache.js.map +1 -0
- package/package.json +21 -14
- package/dist/@-bold-lined-BLLFKBFI.svg +0 -10
- package/dist/AgentRichTextReadonly-F6PHC5SX.js +0 -18
- package/dist/add-lined-bold-5QPUDZCU.svg +0 -3
- package/dist/chunk-4YCCATI4.js.map +0 -1
- package/dist/chunk-4YVKAPKW.js.map +0 -1
- package/dist/chunk-4ZWV57MF.js.map +0 -1
- package/dist/chunk-7MPN2JGL.js.map +0 -1
- package/dist/chunk-BXOKBZH4.js.map +0 -1
- package/dist/chunk-C35SNDVZ.js.map +0 -1
- package/dist/chunk-F7Q7QK42.js.map +0 -1
- package/dist/chunk-H6IQ63DQ.js +0 -14
- package/dist/chunk-H6IQ63DQ.js.map +0 -1
- package/dist/chunk-KJQERFKX.js.map +0 -1
- package/dist/chunk-LDZ6C3YV.js.map +0 -1
- package/dist/chunk-QY22OBJS.js.map +0 -1
- package/dist/chunk-TKBEVCHG.js.map +0 -1
- package/dist/chunk-UFIEUC3Y.js.map +0 -1
- package/dist/chunk-V5ROOS2O.js.map +0 -1
- package/dist/chunk-ZSJBCZUH.js.map +0 -1
- package/dist/chunk-ZWY32ZKZ.js.map +0 -1
- package/dist/claudecode-flat-filled-NHO4JCVK.svg +0 -10
- package/dist/codex-flat-filled-WYHCF5VR.svg +0 -10
- package/dist/cursor-flat-filled-CL7N3BTZ.svg +0 -3
- package/dist/handoff-lined-4WQUBVG3.svg +0 -11
- package/dist/open-link-lined-JWEKUKME.svg +0 -4
- package/dist/opencode-flat-filled-CYAJPX45.svg +0 -4
- package/dist/tutti-flat-filled-K32QBTZE.svg +0 -12
- /package/dist/{AgentRichTextReadonly-F6PHC5SX.js.map → AgentRichTextReadonly-42TUVYX5.js.map} +0 -0
- /package/dist/{chunk-OWW7CU4U.js.map → chunk-25BPR75P.js.map} +0 -0
- /package/dist/{chunk-N4WVVCNI.js.map → chunk-2QHKXI5N.js.map} +0 -0
- /package/dist/{chunk-4YG7YK7S.js.map → chunk-L2GENUG3.js.map} +0 -0
- /package/dist/{chunk-J2HG7UCP.js.map → chunk-OEYXSD3O.js.map} +0 -0
- /package/dist/{chunk-P3CVAWGJ.js.map → chunk-QTW5CH62.js.map} +0 -0
- /package/dist/{chunk-L3GMMGRS.js.map → chunk-R2ZADXRB.js.map} +0 -0
- /package/dist/{chunk-SN6UYX54.js.map → chunk-W6TO6K2X.js.map} +0 -0
- /package/dist/{chunk-UGVI47X6.js.map → chunk-YNSXUEIR.js.map} +0 -0
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createWorkspaceQueryCache
|
|
3
|
+
} from "./chunk-J4K7KIFZ.js";
|
|
1
4
|
import {
|
|
2
5
|
AGENT_GUI_COLLAPSED_MIN_WIDTH_PX,
|
|
3
6
|
AGENT_GUI_CONVERSATION_RAIL_MIN_WIDTH_PX,
|
|
@@ -9,11 +12,12 @@ import {
|
|
|
9
12
|
resolveAgentGuiSessionProviderFlatIconUrl,
|
|
10
13
|
resolveNextAgentGUIConversationRailWidthPx,
|
|
11
14
|
shouldAutoCollapseAgentGUIConversationRail
|
|
12
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-EBXOSQ5G.js";
|
|
13
16
|
import {
|
|
14
17
|
AGENT_PROVIDERS,
|
|
15
18
|
AGENT_PROVIDER_LABEL,
|
|
16
19
|
deriveAgentGUIOptimisticConversationTitle,
|
|
20
|
+
isAgentGUIConversationTitleIconMentionKind,
|
|
17
21
|
isAgentGUIProviderUnresolved,
|
|
18
22
|
normalizeAgentGUIProviderIdentity,
|
|
19
23
|
resolveAgentGUIConversationBrowserFreeTitle,
|
|
@@ -25,10 +29,10 @@ import {
|
|
|
25
29
|
resolveAgentGUIFirstUserMessageDisplayPrompt,
|
|
26
30
|
resolveAgentGUIProviderDisplayLabel,
|
|
27
31
|
resolveAgentGUIProviderIdentity
|
|
28
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-BM3CSFWU.js";
|
|
29
33
|
import {
|
|
30
34
|
resolveAgentGuiWorkbenchProviderLabel
|
|
31
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-R2ZADXRB.js";
|
|
32
36
|
import {
|
|
33
37
|
AgentConversationFlow,
|
|
34
38
|
Button,
|
|
@@ -60,7 +64,7 @@ import {
|
|
|
60
64
|
toLocalShortDateTime,
|
|
61
65
|
updateAgentComposerDraft,
|
|
62
66
|
useProjectedAgentConversation
|
|
63
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-BRLKORQI.js";
|
|
64
68
|
import {
|
|
65
69
|
agentRichTextContentToPromptText,
|
|
66
70
|
createAgentRichTextInputExtensions,
|
|
@@ -70,25 +74,25 @@ import {
|
|
|
70
74
|
plainTextToAgentRichTextInlineContent,
|
|
71
75
|
skillDescriptionForDisplay,
|
|
72
76
|
skillTriggerForPrefix
|
|
73
|
-
} from "./chunk-
|
|
77
|
+
} from "./chunk-JBX3JPTC.js";
|
|
74
78
|
import {
|
|
75
79
|
openAgentEnvPanel
|
|
76
|
-
} from "./chunk-
|
|
80
|
+
} from "./chunk-VMQNG2KI.js";
|
|
77
81
|
import {
|
|
78
82
|
AgentFileMentionPalette,
|
|
79
83
|
agentMentionItemKey
|
|
80
|
-
} from "./chunk-
|
|
84
|
+
} from "./chunk-QTW5CH62.js";
|
|
81
85
|
import {
|
|
82
86
|
normalizeAgentGUIAgents,
|
|
83
87
|
projectAgentGUIAgentsToInternalTargets
|
|
84
|
-
} from "./chunk-
|
|
88
|
+
} from "./chunk-7OYHDOGG.js";
|
|
85
89
|
import {
|
|
86
90
|
AGENT_MENTION_FILTER_TAB_ORDER,
|
|
87
91
|
AgentMentionSearchController,
|
|
88
92
|
DEFAULT_AGENT_MENTION_FILTER,
|
|
89
93
|
agentGuiScheduler,
|
|
90
94
|
buildWorkspaceAgentActivityListViewModel
|
|
91
|
-
} from "./chunk-
|
|
95
|
+
} from "./chunk-UFD2QKGC.js";
|
|
92
96
|
import {
|
|
93
97
|
AGENT_RICH_TEXT_CARET_ANCHOR,
|
|
94
98
|
createAgentSessionMarkdownLink,
|
|
@@ -99,7 +103,7 @@ import {
|
|
|
99
103
|
mentionItemToAttrs,
|
|
100
104
|
normalizeAgentSessionMentionTitle,
|
|
101
105
|
parseMentionItemFromHref
|
|
102
|
-
} from "./chunk-
|
|
106
|
+
} from "./chunk-OEYXSD3O.js";
|
|
103
107
|
import {
|
|
104
108
|
AgentInteractivePromptSurface,
|
|
105
109
|
PLAN_IMPLEMENTATION_ACTION_FEEDBACK,
|
|
@@ -109,15 +113,16 @@ import {
|
|
|
109
113
|
dispatchAgentPlanPromptAction,
|
|
110
114
|
latestPlanTurnId,
|
|
111
115
|
planImplementationPromptFromPlanTurn
|
|
112
|
-
} from "./chunk-
|
|
116
|
+
} from "./chunk-AIZJHA4Q.js";
|
|
113
117
|
import {
|
|
114
118
|
useEngineSelector
|
|
115
119
|
} from "./chunk-2RQM7PJN.js";
|
|
116
120
|
import {
|
|
117
121
|
AgentMessageMarkdown,
|
|
118
122
|
ZoomableImage,
|
|
123
|
+
normalizeAgentApprovalPurpose,
|
|
119
124
|
resolveWorkspaceLinkAction
|
|
120
|
-
} from "./chunk-
|
|
125
|
+
} from "./chunk-U4CVBCHD.js";
|
|
121
126
|
import {
|
|
122
127
|
AgentTargetPresentationProvider,
|
|
123
128
|
cn,
|
|
@@ -135,36 +140,37 @@ import {
|
|
|
135
140
|
useAgentHostApi,
|
|
136
141
|
useOptionalAgentActivityRuntime,
|
|
137
142
|
useOptionalAgentHostApi
|
|
138
|
-
} from "./chunk-
|
|
143
|
+
} from "./chunk-E74BMFHI.js";
|
|
139
144
|
import {
|
|
140
145
|
MANAGED_AGENT_ICON_FALLBACK_URL,
|
|
141
146
|
MANAGED_AGENT_ICON_URLS,
|
|
142
147
|
MANAGED_AGENT_PROVIDER_RAIL_ICON_URLS
|
|
143
|
-
} from "./chunk-
|
|
148
|
+
} from "./chunk-W6TO6K2X.js";
|
|
144
149
|
import {
|
|
150
|
+
isBetaAgentProvider,
|
|
145
151
|
normalizeManagedAgentProvider
|
|
146
|
-
} from "./chunk-
|
|
152
|
+
} from "./chunk-7KVZPJ3O.js";
|
|
147
153
|
import {
|
|
148
154
|
AgentGuiI18nProvider,
|
|
149
155
|
translate,
|
|
150
156
|
useTranslation
|
|
151
|
-
} from "./chunk-
|
|
157
|
+
} from "./chunk-25BPR75P.js";
|
|
152
158
|
import {
|
|
153
159
|
migratedAgentGUIProviderIdentityCatalog,
|
|
154
160
|
resolveAgentGUIProviderCatalogIdentity,
|
|
155
161
|
resolveMigratedAgentGUIProviderIdentity
|
|
156
|
-
} from "./chunk-
|
|
162
|
+
} from "./chunk-6CUELYIF.js";
|
|
157
163
|
import {
|
|
158
164
|
agentColorfulUrl,
|
|
159
165
|
resolveProviderIconAsset
|
|
160
|
-
} from "./chunk-
|
|
166
|
+
} from "./chunk-YNSXUEIR.js";
|
|
161
167
|
|
|
162
168
|
// AgentGUI.tsx
|
|
163
169
|
import { memo as memo15 } from "react";
|
|
164
170
|
import { TooltipProvider as TooltipProvider5 } from "@tutti-os/ui-system";
|
|
165
171
|
|
|
166
172
|
// agent-gui/agentGuiNode/AgentGUINode.tsx
|
|
167
|
-
import { memo as memo14, useCallback as
|
|
173
|
+
import { memo as memo14, useCallback as useCallback51, useEffect as useEffect39, useMemo as useMemo39 } from "react";
|
|
168
174
|
import { createWorkspaceUserProjectI18nRuntime } from "@tutti-os/workspace-user-project/i18n";
|
|
169
175
|
import { createWorkspaceFileManagerI18nRuntime } from "@tutti-os/workspace-file-manager";
|
|
170
176
|
import { useReferenceProvenanceFilterCatalog } from "@tutti-os/workspace-file-reference/react";
|
|
@@ -2019,7 +2025,7 @@ import {
|
|
|
2019
2025
|
selectEngineSessionIsRespondingToInteraction as selectEngineSessionIsRespondingToInteraction2,
|
|
2020
2026
|
selectWorkspaceAgentConsumerSessions as selectWorkspaceAgentConsumerSessions2
|
|
2021
2027
|
} from "@tutti-os/agent-activity-core";
|
|
2022
|
-
import { useCallback as
|
|
2028
|
+
import { useCallback as useCallback25, useEffect as useEffect14, useMemo as useMemo18, useRef as useRef18 } from "react";
|
|
2023
2029
|
|
|
2024
2030
|
// host/agentHostAccountStore.ts
|
|
2025
2031
|
import { create as create2 } from "zustand";
|
|
@@ -2333,6 +2339,8 @@ function mergeMessageSnapshot(previous, next) {
|
|
|
2333
2339
|
return {
|
|
2334
2340
|
...previous,
|
|
2335
2341
|
...next,
|
|
2342
|
+
sequence: next.sequence ?? previous?.sequence,
|
|
2343
|
+
createdAtUnixMs: next.createdAtUnixMs ?? previous?.createdAtUnixMs,
|
|
2336
2344
|
...semantics ? { semantics } : {},
|
|
2337
2345
|
payload: {
|
|
2338
2346
|
...previous?.payload ?? {},
|
|
@@ -2388,6 +2396,11 @@ function workspaceTimelineFields(workspaceId) {
|
|
|
2388
2396
|
};
|
|
2389
2397
|
}
|
|
2390
2398
|
function compareMessagesByDisplayOrder(left, right) {
|
|
2399
|
+
const leftSequence = normalizedPositiveNumber(left.sequence);
|
|
2400
|
+
const rightSequence = normalizedPositiveNumber(right.sequence);
|
|
2401
|
+
if (leftSequence > 0 && rightSequence > 0 && leftSequence !== rightSequence) {
|
|
2402
|
+
return leftSequence - rightSequence;
|
|
2403
|
+
}
|
|
2391
2404
|
const leftTime = messageDisplayOrderTime(left);
|
|
2392
2405
|
const rightTime = messageDisplayOrderTime(right);
|
|
2393
2406
|
if (leftTime > 0 && rightTime > 0 && leftTime !== rightTime) {
|
|
@@ -2408,7 +2421,7 @@ function normalizedPositiveNumber(value) {
|
|
|
2408
2421
|
return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : 0;
|
|
2409
2422
|
}
|
|
2410
2423
|
function messageDisplayOrderTime(message) {
|
|
2411
|
-
return normalizedPositiveNumber(message.startedAtUnixMs) || normalizedPositiveNumber(message.occurredAtUnixMs) || normalizedPositiveNumber(message.completedAtUnixMs);
|
|
2424
|
+
return normalizedPositiveNumber(message.startedAtUnixMs) || normalizedPositiveNumber(message.createdAtUnixMs) || normalizedPositiveNumber(message.occurredAtUnixMs) || normalizedPositiveNumber(message.completedAtUnixMs);
|
|
2412
2425
|
}
|
|
2413
2426
|
function toolCallItemType(status) {
|
|
2414
2427
|
switch (normalizeToken(status)) {
|
|
@@ -3244,6 +3257,7 @@ function buildAgentGUIConversationDetail({
|
|
|
3244
3257
|
const detail = buildWorkspaceAgentSessionDetailViewModel({
|
|
3245
3258
|
activity: resolvedActivity,
|
|
3246
3259
|
session,
|
|
3260
|
+
sessionTurns: conversation.sessionTurns,
|
|
3247
3261
|
timelineItems: [...timelineItems],
|
|
3248
3262
|
workspaceRoot
|
|
3249
3263
|
});
|
|
@@ -3758,6 +3772,11 @@ function resolveAgentGUIAgentTarget(input) {
|
|
|
3758
3772
|
);
|
|
3759
3773
|
return targetById.get(input.defaultAgentTargetId?.trim() ?? "") ?? targetById.get(localAgentGUIAgentTargetId(input.provider)) ?? agentTargets.find((target) => target.disabled !== true) ?? agentTargets[0] ?? (input.useStaticCatalog === false ? null : createLocalAgentGUIAgentTarget(input.provider));
|
|
3760
3774
|
}
|
|
3775
|
+
function isAgentGUIAgentTargetComingSoon(target, comingSoonProviders = []) {
|
|
3776
|
+
return Boolean(
|
|
3777
|
+
target && (target.availability?.status === "coming_soon" || comingSoonProviders.includes(target.provider))
|
|
3778
|
+
);
|
|
3779
|
+
}
|
|
3761
3780
|
function agentGUIAgentTargetRefsEqual(left, right) {
|
|
3762
3781
|
if (left === right) {
|
|
3763
3782
|
return true;
|
|
@@ -4900,7 +4919,7 @@ function useAgentConversationMessagePaging(input) {
|
|
|
4900
4919
|
if (!agentSessionId) return;
|
|
4901
4920
|
const current = inputRef.current;
|
|
4902
4921
|
const activationStatus = current.reload.getActivationStatus(agentSessionId);
|
|
4903
|
-
if (activationStatus === "failed" || activationStatus === "requested" || activationStatus === "uncertain")
|
|
4922
|
+
if (activationStatus === "failed" || activationStatus === "canceled" || activationStatus === "requested" || activationStatus === "uncertain")
|
|
4904
4923
|
return;
|
|
4905
4924
|
if (options.reloadConversations) {
|
|
4906
4925
|
current.reload.syncConversationList(agentSessionId);
|
|
@@ -5145,12 +5164,16 @@ function interactiveApprovalFromInteraction(interaction) {
|
|
|
5145
5164
|
};
|
|
5146
5165
|
}).filter((option) => option !== null);
|
|
5147
5166
|
if (!callId || normalizedOptions.length === 0) return null;
|
|
5167
|
+
const approvalPurpose = normalizeAgentApprovalPurpose(
|
|
5168
|
+
interaction.metadata?.approvalPurpose
|
|
5169
|
+
);
|
|
5148
5170
|
return {
|
|
5149
5171
|
kind: "approval",
|
|
5150
5172
|
id: `approval:${callId}`,
|
|
5151
5173
|
turnId: interaction.turnId,
|
|
5152
5174
|
requestId: interaction.requestId,
|
|
5153
5175
|
callId,
|
|
5176
|
+
...approvalPurpose ? { approvalPurpose } : {},
|
|
5154
5177
|
title: interaction.toolName?.trim() || "Approval required",
|
|
5155
5178
|
status: "waiting_approval",
|
|
5156
5179
|
toolName: interaction.toolName?.trim() || null,
|
|
@@ -5308,7 +5331,7 @@ function stabilizeConversationDetail(previous, next) {
|
|
|
5308
5331
|
previous.activity,
|
|
5309
5332
|
next.activity
|
|
5310
5333
|
);
|
|
5311
|
-
if (previous.cwd === next.cwd && previous.workspaceRoot === next.workspaceRoot && previous.showProcessingIndicator === next.showProcessingIndicator && previous.turns === next.turns && previous.session === session && previous.activity === activity) {
|
|
5334
|
+
if (previous.cwd === next.cwd && previous.workspaceRoot === next.workspaceRoot && previous.showProcessingIndicator === next.showProcessingIndicator && previous.turns === next.turns && previous.sessionTurns === next.sessionTurns && previous.session === session && previous.activity === activity) {
|
|
5312
5335
|
return previous;
|
|
5313
5336
|
}
|
|
5314
5337
|
return {
|
|
@@ -5979,6 +6002,9 @@ function useAgentGUIActivation({
|
|
|
5979
6002
|
}
|
|
5980
6003
|
|
|
5981
6004
|
// agent-gui/agentGuiNode/controller/useAgentGUIActiveMessages.ts
|
|
6005
|
+
import {
|
|
6006
|
+
isPendingActivationViable
|
|
6007
|
+
} from "@tutti-os/agent-activity-core";
|
|
5982
6008
|
import { useMemo as useMemo4 } from "react";
|
|
5983
6009
|
|
|
5984
6010
|
// host/workspaceAgentSessionMessages.ts
|
|
@@ -6045,7 +6071,7 @@ function useAgentGUIActiveMessages(input) {
|
|
|
6045
6071
|
workspaceId
|
|
6046
6072
|
})
|
|
6047
6073
|
);
|
|
6048
|
-
const pendingActivationMessage = activePendingActivation?.mode === "new" && activePendingActivation
|
|
6074
|
+
const pendingActivationMessage = activePendingActivation?.mode === "new" && isPendingActivationViable(activePendingActivation) && activePendingActivation.clientSubmitId && activePendingActivation.content.length > 0 ? createOptimisticPromptMessage({
|
|
6049
6075
|
agentSessionId: activePendingActivation.agentSessionId,
|
|
6050
6076
|
clientSubmitId: activePendingActivation.clientSubmitId,
|
|
6051
6077
|
content: [...activePendingActivation.content],
|
|
@@ -6077,7 +6103,9 @@ function useAgentGUIActiveMessages(input) {
|
|
|
6077
6103
|
|
|
6078
6104
|
// agent-gui/agentGuiNode/controller/useAgentGUIConversationRouting.ts
|
|
6079
6105
|
import {
|
|
6106
|
+
isPendingActivationViable as isPendingActivationViable2,
|
|
6080
6107
|
selectEngineSessionReconcile,
|
|
6108
|
+
selectLatestActivationForSession as selectLatestActivationForSession2,
|
|
6081
6109
|
selectWorkspaceAgentConsumerSession
|
|
6082
6110
|
} from "@tutti-os/agent-activity-core";
|
|
6083
6111
|
import { useCallback as useCallback6, useEffect as useEffect3 } from "react";
|
|
@@ -6247,6 +6275,16 @@ function useAgentGUIConversationRouting(input) {
|
|
|
6247
6275
|
ensureTransientOpenSessionConversation(requestedId);
|
|
6248
6276
|
return;
|
|
6249
6277
|
}
|
|
6278
|
+
if (intent.tag !== "home") {
|
|
6279
|
+
const activation = selectLatestActivationForSession2(
|
|
6280
|
+
sessionEngine.getSnapshot(),
|
|
6281
|
+
intent.id
|
|
6282
|
+
);
|
|
6283
|
+
if (activation?.mode === "new" && !isPendingActivationViable2(activation)) {
|
|
6284
|
+
setIntent({ tag: "home" });
|
|
6285
|
+
return;
|
|
6286
|
+
}
|
|
6287
|
+
}
|
|
6250
6288
|
switch (intent.tag) {
|
|
6251
6289
|
case "home":
|
|
6252
6290
|
return;
|
|
@@ -6278,8 +6316,9 @@ function useAgentGUIConversationRouting(input) {
|
|
|
6278
6316
|
|
|
6279
6317
|
// agent-gui/agentGuiNode/controller/useAgentGUIConversationSelectionController.ts
|
|
6280
6318
|
import {
|
|
6319
|
+
isPendingActivationViable as isPendingActivationViable3,
|
|
6281
6320
|
selectEngineSessionDetailHydrated,
|
|
6282
|
-
selectLatestActivationForSession
|
|
6321
|
+
selectLatestActivationForSession as selectLatestActivationForSession3
|
|
6283
6322
|
} from "@tutti-os/agent-activity-core";
|
|
6284
6323
|
import { useEffect as useEffect4 } from "react";
|
|
6285
6324
|
function clearFailedAgentGUIActivationSelection(current, failedAgentSessionId) {
|
|
@@ -6325,7 +6364,7 @@ function useAgentGUIConversationSelectionController(input) {
|
|
|
6325
6364
|
});
|
|
6326
6365
|
}, [currentUserId, sessionEngine, workspaceId]);
|
|
6327
6366
|
useEffect4(() => {
|
|
6328
|
-
if (activePendingActivation?.mode === "new" && activePendingActivation
|
|
6367
|
+
if (activePendingActivation?.mode === "new" && !isPendingActivationViable3(activePendingActivation) && activeConversationIdRef.current === activePendingActivation.agentSessionId) {
|
|
6329
6368
|
activeConversationIdRef.current = null;
|
|
6330
6369
|
setActiveConversationId(null);
|
|
6331
6370
|
isComposerHomeRef.current = true;
|
|
@@ -6337,9 +6376,11 @@ function useAgentGUIConversationSelectionController(input) {
|
|
|
6337
6376
|
activePendingActivation.agentSessionId
|
|
6338
6377
|
)
|
|
6339
6378
|
);
|
|
6340
|
-
|
|
6341
|
-
|
|
6342
|
-
|
|
6379
|
+
if (activePendingActivation.status === "failed") {
|
|
6380
|
+
setDetailError(
|
|
6381
|
+
activePendingActivation.errorMessage || translate("agentHost.agentGui.sessionActivationFailed")
|
|
6382
|
+
);
|
|
6383
|
+
}
|
|
6343
6384
|
return;
|
|
6344
6385
|
}
|
|
6345
6386
|
if (!activeConversationId) return;
|
|
@@ -6406,7 +6447,7 @@ function useAgentGUIConversationSelectionController(input) {
|
|
|
6406
6447
|
activation: {
|
|
6407
6448
|
forget: activation.clearFailure,
|
|
6408
6449
|
isPending: (agentSessionId) => isPendingNewConversationActivation(
|
|
6409
|
-
|
|
6450
|
+
selectLatestActivationForSession3(
|
|
6410
6451
|
sessionEngine.getSnapshot(),
|
|
6411
6452
|
agentSessionId
|
|
6412
6453
|
)
|
|
@@ -6484,6 +6525,7 @@ import { useMemo as useMemo6, useRef as useRef7, useState as useState3 } from "r
|
|
|
6484
6525
|
// contexts/workspace/presentation/renderer/agentGuiConversationList/useAgentGuiConversationList.ts
|
|
6485
6526
|
import { useMemo as useMemo5 } from "react";
|
|
6486
6527
|
import {
|
|
6528
|
+
isPendingActivationViable as isPendingActivationViable4,
|
|
6487
6529
|
selectWorkspaceAgentConsumerSessions,
|
|
6488
6530
|
selectPendingActivations,
|
|
6489
6531
|
selectWorkspaceReconcileState
|
|
@@ -6593,11 +6635,11 @@ function useAgentGuiConversationList(engine, query, agentTargets = EMPTY_AGENT_G
|
|
|
6593
6635
|
);
|
|
6594
6636
|
const latestNewActivationBySessionId = new Map(
|
|
6595
6637
|
pendingActivations.filter(
|
|
6596
|
-
(activation) => activation.mode === "new" && activation
|
|
6638
|
+
(activation) => activation.mode === "new" && isPendingActivationViable4(activation)
|
|
6597
6639
|
).map((activation) => [activation.agentSessionId, activation])
|
|
6598
6640
|
);
|
|
6599
6641
|
const pendingConversations = pendingActivations.filter(
|
|
6600
|
-
(activation) => activation.mode === "new" && activation
|
|
6642
|
+
(activation) => activation.mode === "new" && isPendingActivationViable4(activation) && !canonicalIds.has(activation.agentSessionId)
|
|
6601
6643
|
).map((activation) => {
|
|
6602
6644
|
const target = agentTargets.find(
|
|
6603
6645
|
(candidate) => candidate.agentTargetId === activation.agentTargetId
|
|
@@ -6918,7 +6960,7 @@ function useAgentGUIComposerCapabilities(input) {
|
|
|
6918
6960
|
|
|
6919
6961
|
// agent-gui/agentGuiNode/controller/useAgentGUIComposerOptionsSync.ts
|
|
6920
6962
|
import {
|
|
6921
|
-
selectLatestActivationForSession as
|
|
6963
|
+
selectLatestActivationForSession as selectLatestActivationForSession4
|
|
6922
6964
|
} from "@tutti-os/agent-activity-core";
|
|
6923
6965
|
import { useCallback as useCallback7, useEffect as useEffect5, useRef as useRef8 } from "react";
|
|
6924
6966
|
|
|
@@ -7128,21 +7170,6 @@ function useAgentGUIComposerOptionsSync(input) {
|
|
|
7128
7170
|
]
|
|
7129
7171
|
);
|
|
7130
7172
|
input.loadDraftComposerOptionsRef.current = loadDraftComposerOptions;
|
|
7131
|
-
useEffect5(() => {
|
|
7132
|
-
if (input.previewMode) return;
|
|
7133
|
-
const projectKey = `${input.composerTargetData.agentTargetId ?? input.composerTargetData.provider}\0${input.selectedProjectPath ?? ""}`;
|
|
7134
|
-
const previous = input.composerOptionsProjectKeyRef.current;
|
|
7135
|
-
input.composerOptionsProjectKeyRef.current = projectKey;
|
|
7136
|
-
if (previous !== null && previous !== projectKey) {
|
|
7137
|
-
loadDraftComposerOptions({ force: true });
|
|
7138
|
-
}
|
|
7139
|
-
}, [
|
|
7140
|
-
input.composerTargetData.agentTargetId,
|
|
7141
|
-
input.composerTargetData.provider,
|
|
7142
|
-
input.previewMode,
|
|
7143
|
-
input.selectedProjectPath,
|
|
7144
|
-
loadDraftComposerOptions
|
|
7145
|
-
]);
|
|
7146
7173
|
useEffect5(() => {
|
|
7147
7174
|
if (input.previewMode) return void 0;
|
|
7148
7175
|
return subscribeCoalesced(
|
|
@@ -7190,6 +7217,7 @@ function useAgentGUIComposerOptionsSync(input) {
|
|
|
7190
7217
|
input.isCreatingConversation,
|
|
7191
7218
|
input.previewMode,
|
|
7192
7219
|
input.providerComposerOptions?.behavior?.prewarmDraftSession,
|
|
7220
|
+
input.selectedProjectPath,
|
|
7193
7221
|
loadDraftComposerOptions
|
|
7194
7222
|
]);
|
|
7195
7223
|
useEffect5(() => {
|
|
@@ -7207,11 +7235,11 @@ function useAgentGUIComposerOptionsSync(input) {
|
|
|
7207
7235
|
]);
|
|
7208
7236
|
useEffect5(() => {
|
|
7209
7237
|
if (input.previewMode || !input.activeConversationId) return;
|
|
7210
|
-
const activation =
|
|
7238
|
+
const activation = selectLatestActivationForSession4(
|
|
7211
7239
|
input.sessionEngine.getSnapshot(),
|
|
7212
7240
|
input.activeConversationId
|
|
7213
7241
|
);
|
|
7214
|
-
if (activation?.status === "failed" || activation?.status === "requested" || activation?.status === "uncertain") {
|
|
7242
|
+
if (activation?.status === "failed" || activation?.status === "canceled" || activation?.status === "requested" || activation?.status === "uncertain") {
|
|
7215
7243
|
return;
|
|
7216
7244
|
}
|
|
7217
7245
|
input.reloadSelectedConversation(input.activeConversationId, {
|
|
@@ -7224,7 +7252,7 @@ function useAgentGUIComposerOptionsSync(input) {
|
|
|
7224
7252
|
input.reloadSelectedConversation,
|
|
7225
7253
|
input.sessionEngine
|
|
7226
7254
|
]);
|
|
7227
|
-
return {
|
|
7255
|
+
return { loadDraftComposerOptions };
|
|
7228
7256
|
}
|
|
7229
7257
|
|
|
7230
7258
|
// agent-gui/agentGuiNode/controller/useAgentGUIControllerRefs.ts
|
|
@@ -7235,7 +7263,6 @@ function useAgentGUIControllerRefs(input) {
|
|
|
7235
7263
|
const userProjectsRef = useRef9(input.userProjects);
|
|
7236
7264
|
const isNoProjectPathRef = useRef9(input.isNoProjectPath);
|
|
7237
7265
|
const userProjectsLoadSeqRef = useRef9(0);
|
|
7238
|
-
const composerOptionsProjectKeyRef = useRef9(null);
|
|
7239
7266
|
const conversationsRef = useRef9(input.conversations);
|
|
7240
7267
|
const isMountedRef = useRef9(true);
|
|
7241
7268
|
const agentActivitySnapshotRef = useRef9(input.agentActivitySnapshot);
|
|
@@ -7300,7 +7327,6 @@ function useAgentGUIControllerRefs(input) {
|
|
|
7300
7327
|
return {
|
|
7301
7328
|
activeConversationIdRef,
|
|
7302
7329
|
agentActivitySnapshotRef,
|
|
7303
|
-
composerOptionsProjectKeyRef,
|
|
7304
7330
|
conversationIdsRef,
|
|
7305
7331
|
conversationsRef,
|
|
7306
7332
|
dataRef,
|
|
@@ -7335,8 +7361,8 @@ function useAgentGUIControllerRefs(input) {
|
|
|
7335
7361
|
}
|
|
7336
7362
|
|
|
7337
7363
|
// agent-gui/agentGuiNode/controller/useAgentGUIOperationActions.ts
|
|
7338
|
-
import { selectEngineSession as
|
|
7339
|
-
import { useCallback as
|
|
7364
|
+
import { selectEngineSession as selectEngineSession3 } from "@tutti-os/agent-activity-core";
|
|
7365
|
+
import { useCallback as useCallback19 } from "react";
|
|
7340
7366
|
|
|
7341
7367
|
// agent-gui/agentGuiNode/controller/useAgentGUIComposerSettingsActions.ts
|
|
7342
7368
|
import {
|
|
@@ -8441,7 +8467,10 @@ function useAgentGUIConversationMetadataActions(input) {
|
|
|
8441
8467
|
}
|
|
8442
8468
|
|
|
8443
8469
|
// agent-gui/agentGuiNode/controller/useAgentGUINewConversationActivation.ts
|
|
8444
|
-
import {
|
|
8470
|
+
import {
|
|
8471
|
+
isPendingActivationViable as isPendingActivationViable5,
|
|
8472
|
+
selectLatestActivationForSession as selectLatestActivationForSession5
|
|
8473
|
+
} from "@tutti-os/agent-activity-core";
|
|
8445
8474
|
import { useCallback as useCallback14 } from "react";
|
|
8446
8475
|
function useAgentGUINewConversationActivation(input) {
|
|
8447
8476
|
const {
|
|
@@ -8554,10 +8583,12 @@ function useAgentGUINewConversationActivation(input) {
|
|
|
8554
8583
|
options: snapshotComposerOptions
|
|
8555
8584
|
});
|
|
8556
8585
|
const prewarmedSessionId = normalizedInitialContent.length > 0 && snapshotComposerOptions?.behavior?.prewarmDraftSession === true ? draftAgentSessionIdFromComposerOptions(snapshotComposerOptions) : null;
|
|
8557
|
-
const agentSessionId = prewarmedSessionId && activation.stateFor(prewarmedSessionId) === "inactive" &&
|
|
8558
|
-
|
|
8559
|
-
|
|
8560
|
-
|
|
8586
|
+
const agentSessionId = prewarmedSessionId && activation.stateFor(prewarmedSessionId) === "inactive" && isPendingActivationViable5(
|
|
8587
|
+
selectLatestActivationForSession5(
|
|
8588
|
+
sessionEngine.getSnapshot(),
|
|
8589
|
+
prewarmedSessionId
|
|
8590
|
+
)
|
|
8591
|
+
) ? prewarmedSessionId : createAgentGUIConversationId();
|
|
8561
8592
|
const submitTrace = createAgentSubmitTraceState({
|
|
8562
8593
|
agentSessionId,
|
|
8563
8594
|
content: normalizedInitialContent,
|
|
@@ -8776,9 +8807,9 @@ function useAgentGUIQueueActions({
|
|
|
8776
8807
|
import {
|
|
8777
8808
|
selectEngineCancelState,
|
|
8778
8809
|
selectEngineHasVisibleQueuedSubmit,
|
|
8779
|
-
selectPendingSubmitsForSession as
|
|
8810
|
+
selectPendingSubmitsForSession as selectPendingSubmitsForSession3
|
|
8780
8811
|
} from "@tutti-os/agent-activity-core";
|
|
8781
|
-
import { useCallback as
|
|
8812
|
+
import { useCallback as useCallback18, useEffect as useEffect7 } from "react";
|
|
8782
8813
|
|
|
8783
8814
|
// agent-gui/agentGuiNode/controller/agentGuiController.homeDraftHelpers.ts
|
|
8784
8815
|
function clearSubmittedAgentGUIHomeDraft(input) {
|
|
@@ -8810,7 +8841,7 @@ function restoreFailedAgentGUIHomeDraft(input) {
|
|
|
8810
8841
|
// agent-gui/agentGuiNode/controller/AgentGUIHomeDraftSettlementController.ts
|
|
8811
8842
|
import {
|
|
8812
8843
|
selectPendingActivations as selectPendingActivations2,
|
|
8813
|
-
selectPendingSubmitsForSession
|
|
8844
|
+
selectPendingSubmitsForSession as selectPendingSubmitsForSession2
|
|
8814
8845
|
} from "@tutti-os/agent-activity-core";
|
|
8815
8846
|
var AgentGUIHomeDraftSettlementController = class {
|
|
8816
8847
|
applyDraftUpdate;
|
|
@@ -8841,7 +8872,7 @@ var AgentGUIHomeDraftSettlementController = class {
|
|
|
8841
8872
|
);
|
|
8842
8873
|
for (const [clientSubmitId, snapshot] of Object.entries(this.snapshots)) {
|
|
8843
8874
|
const activation = activationsByClientSubmitId.get(clientSubmitId);
|
|
8844
|
-
if (activation?.status === "confirmed" || activation?.status === "failed") {
|
|
8875
|
+
if (activation?.status === "confirmed" || activation?.status === "failed" || activation?.status === "canceled") {
|
|
8845
8876
|
this.applyDraftUpdate(
|
|
8846
8877
|
(drafts) => activation.status === "confirmed" ? clearSubmittedDraftIfUnchanged({ drafts, snapshot }) : restoreFailedAgentGUIHomeDraft({
|
|
8847
8878
|
agentSessionId: activation.agentSessionId,
|
|
@@ -8855,7 +8886,7 @@ var AgentGUIHomeDraftSettlementController = class {
|
|
|
8855
8886
|
}
|
|
8856
8887
|
const targetAgentSessionId = snapshot.targetAgentSessionId ?? (snapshot.sourceScopeKey.startsWith("session:") ? snapshot.sourceScopeKey.slice("session:".length) : "");
|
|
8857
8888
|
if (!targetAgentSessionId) continue;
|
|
8858
|
-
const submit =
|
|
8889
|
+
const submit = selectPendingSubmitsForSession2(
|
|
8859
8890
|
state,
|
|
8860
8891
|
targetAgentSessionId
|
|
8861
8892
|
).find((record) => record.clientSubmitId === clientSubmitId);
|
|
@@ -8890,6 +8921,150 @@ function resolveAgentGUIInteractionTarget(interactions, requestId) {
|
|
|
8890
8921
|
return null;
|
|
8891
8922
|
}
|
|
8892
8923
|
|
|
8924
|
+
// agent-gui/agentGuiNode/controller/useAgentGUIGoalControlActions.ts
|
|
8925
|
+
import {
|
|
8926
|
+
selectEngineSession as selectEngineSession2
|
|
8927
|
+
} from "@tutti-os/agent-activity-core";
|
|
8928
|
+
import { useCallback as useCallback17, useRef as useRef11 } from "react";
|
|
8929
|
+
|
|
8930
|
+
// agent-gui/agentGuiNode/controller/agentGuiOptimisticGoal.ts
|
|
8931
|
+
function projectOptimisticGoalControl(currentGoal, action, objective) {
|
|
8932
|
+
switch (action) {
|
|
8933
|
+
case "clear":
|
|
8934
|
+
return null;
|
|
8935
|
+
case "pause":
|
|
8936
|
+
return currentGoal ? { ...currentGoal, status: "paused" } : null;
|
|
8937
|
+
case "resume":
|
|
8938
|
+
return currentGoal ? { ...currentGoal, status: "active" } : null;
|
|
8939
|
+
case "set": {
|
|
8940
|
+
const normalizedObjective = objective?.trim() ?? "";
|
|
8941
|
+
return normalizedObjective ? { objective: normalizedObjective, status: "active" } : currentGoal;
|
|
8942
|
+
}
|
|
8943
|
+
}
|
|
8944
|
+
}
|
|
8945
|
+
function canonicalGoalConfirmsOptimisticGoal(canonicalGoal, optimisticGoal, reconcileOnObjectiveMatch) {
|
|
8946
|
+
if (optimisticGoal === null) {
|
|
8947
|
+
return canonicalGoal === null;
|
|
8948
|
+
}
|
|
8949
|
+
if (canonicalGoal?.objective !== optimisticGoal.objective) {
|
|
8950
|
+
return false;
|
|
8951
|
+
}
|
|
8952
|
+
return reconcileOnObjectiveMatch || canonicalGoal.status === optimisticGoal.status;
|
|
8953
|
+
}
|
|
8954
|
+
function unresolvedOptimisticGoalControl(optimisticGoalControl, agentSessionId, canonicalSession) {
|
|
8955
|
+
if (optimisticGoalControl?.agentSessionId !== agentSessionId || canonicalSession?.agentSessionId !== agentSessionId) {
|
|
8956
|
+
return optimisticGoalControl?.agentSessionId === agentSessionId ? optimisticGoalControl : null;
|
|
8957
|
+
}
|
|
8958
|
+
return canonicalGoalConfirmsOptimisticGoal(
|
|
8959
|
+
canonicalSession.goal,
|
|
8960
|
+
optimisticGoalControl.goal,
|
|
8961
|
+
optimisticGoalControl.reconcileOnObjectiveMatch
|
|
8962
|
+
) ? null : optimisticGoalControl;
|
|
8963
|
+
}
|
|
8964
|
+
|
|
8965
|
+
// agent-gui/agentGuiNode/controller/useAgentGUIGoalControlActions.ts
|
|
8966
|
+
function useAgentGUIGoalControlActions(input) {
|
|
8967
|
+
const requestSequenceRef = useRef11(0);
|
|
8968
|
+
const beginOptimisticGoalControl = useCallback17(
|
|
8969
|
+
(agentSessionId, action, objective, requestId, reconcileOnObjectiveMatch = false) => {
|
|
8970
|
+
const canonicalSession = selectEngineSession2(
|
|
8971
|
+
input.sessionEngine.getSnapshot(),
|
|
8972
|
+
agentSessionId
|
|
8973
|
+
) ?? null;
|
|
8974
|
+
const pendingGoalControl = unresolvedOptimisticGoalControl(
|
|
8975
|
+
input.optimisticGoalControl,
|
|
8976
|
+
agentSessionId,
|
|
8977
|
+
canonicalSession
|
|
8978
|
+
);
|
|
8979
|
+
const nextRequestId = requestId ?? `goal-control:${Date.now()}:${++requestSequenceRef.current}`;
|
|
8980
|
+
input.setOptimisticGoalControl({
|
|
8981
|
+
agentSessionId,
|
|
8982
|
+
goal: projectOptimisticGoalControl(
|
|
8983
|
+
pendingGoalControl?.goal ?? canonicalSession?.goal ?? null,
|
|
8984
|
+
action,
|
|
8985
|
+
objective
|
|
8986
|
+
),
|
|
8987
|
+
reconcileOnObjectiveMatch,
|
|
8988
|
+
requestId: nextRequestId
|
|
8989
|
+
});
|
|
8990
|
+
return nextRequestId;
|
|
8991
|
+
},
|
|
8992
|
+
[
|
|
8993
|
+
input.optimisticGoalControl,
|
|
8994
|
+
input.sessionEngine,
|
|
8995
|
+
input.setOptimisticGoalControl
|
|
8996
|
+
]
|
|
8997
|
+
);
|
|
8998
|
+
const clearOptimisticGoalControl = useCallback17(
|
|
8999
|
+
(requestId) => {
|
|
9000
|
+
input.setOptimisticGoalControl(
|
|
9001
|
+
(current) => current?.requestId === requestId ? null : current
|
|
9002
|
+
);
|
|
9003
|
+
},
|
|
9004
|
+
[input.setOptimisticGoalControl]
|
|
9005
|
+
);
|
|
9006
|
+
const goalControl = useCallback17(
|
|
9007
|
+
(action, objective, submittedDraftScopeKey) => {
|
|
9008
|
+
if (input.previewMode) return;
|
|
9009
|
+
const agentSessionId = input.activeConversationIdRef.current;
|
|
9010
|
+
if (!agentSessionId) return;
|
|
9011
|
+
const submittedDraftSnapshot = submittedDraftScopeKey ? {
|
|
9012
|
+
sourceScopeKey: submittedDraftScopeKey,
|
|
9013
|
+
content: snapshotAgentComposerDraft(
|
|
9014
|
+
input.draftByScopeKeyRef.current[submittedDraftScopeKey] ?? emptyAgentComposerDraft()
|
|
9015
|
+
),
|
|
9016
|
+
targetAgentSessionId: agentSessionId
|
|
9017
|
+
} : null;
|
|
9018
|
+
input.setDetailError(null);
|
|
9019
|
+
const optimisticRequestId = beginOptimisticGoalControl(
|
|
9020
|
+
agentSessionId,
|
|
9021
|
+
action,
|
|
9022
|
+
objective
|
|
9023
|
+
);
|
|
9024
|
+
void input.agentActivityRuntime.goalControl({
|
|
9025
|
+
workspaceId: input.workspaceId,
|
|
9026
|
+
agentSessionId,
|
|
9027
|
+
action,
|
|
9028
|
+
...objective !== void 0 ? { objective } : {}
|
|
9029
|
+
}).then(() => {
|
|
9030
|
+
clearOptimisticGoalControl(optimisticRequestId);
|
|
9031
|
+
if (submittedDraftSnapshot) {
|
|
9032
|
+
input.setDraftByScopeKey((current) => {
|
|
9033
|
+
const next = clearSubmittedDraftIfUnchanged({
|
|
9034
|
+
drafts: current,
|
|
9035
|
+
snapshot: submittedDraftSnapshot
|
|
9036
|
+
});
|
|
9037
|
+
input.draftByScopeKeyRef.current = next;
|
|
9038
|
+
return next;
|
|
9039
|
+
});
|
|
9040
|
+
}
|
|
9041
|
+
if (action === "clear" && input.isCurrentConversation(agentSessionId)) {
|
|
9042
|
+
input.setGoalClearNoticeSequence((current) => current + 1);
|
|
9043
|
+
}
|
|
9044
|
+
}).catch((error) => {
|
|
9045
|
+
clearOptimisticGoalControl(optimisticRequestId);
|
|
9046
|
+
if (input.isCurrentConversation(agentSessionId)) {
|
|
9047
|
+
input.setDetailError(getAgentGUIErrorMessage(error));
|
|
9048
|
+
}
|
|
9049
|
+
});
|
|
9050
|
+
},
|
|
9051
|
+
[
|
|
9052
|
+
beginOptimisticGoalControl,
|
|
9053
|
+
clearOptimisticGoalControl,
|
|
9054
|
+
input.activeConversationIdRef,
|
|
9055
|
+
input.agentActivityRuntime,
|
|
9056
|
+
input.draftByScopeKeyRef,
|
|
9057
|
+
input.isCurrentConversation,
|
|
9058
|
+
input.previewMode,
|
|
9059
|
+
input.setDetailError,
|
|
9060
|
+
input.setDraftByScopeKey,
|
|
9061
|
+
input.setGoalClearNoticeSequence,
|
|
9062
|
+
input.workspaceId
|
|
9063
|
+
]
|
|
9064
|
+
);
|
|
9065
|
+
return { beginOptimisticGoalControl, goalControl };
|
|
9066
|
+
}
|
|
9067
|
+
|
|
8893
9068
|
// agent-gui/agentGuiNode/controller/useAgentGUISubmitInteractionActions.ts
|
|
8894
9069
|
function typedGoalControlFromComposer(content, _displayPrompt) {
|
|
8895
9070
|
if (content.length !== 1 || content[0]?.type !== "text") {
|
|
@@ -8934,19 +9109,35 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
8934
9109
|
planActionsRef,
|
|
8935
9110
|
previewMode,
|
|
8936
9111
|
promptImagesSupported,
|
|
9112
|
+
optimisticGoalControl,
|
|
8937
9113
|
sessionEngine,
|
|
8938
9114
|
setActiveConversationId,
|
|
8939
9115
|
setDetailError,
|
|
8940
9116
|
setDraftByScopeKey,
|
|
8941
9117
|
setGoalClearNoticeSequence,
|
|
8942
9118
|
setIntent,
|
|
9119
|
+
setOptimisticGoalControl,
|
|
8943
9120
|
submittedDraftSnapshotsRef,
|
|
8944
9121
|
startConversation,
|
|
8945
9122
|
submitPromptRef,
|
|
8946
9123
|
transientConversation,
|
|
8947
9124
|
workspaceId
|
|
8948
9125
|
} = input;
|
|
8949
|
-
const
|
|
9126
|
+
const { beginOptimisticGoalControl, goalControl } = useAgentGUIGoalControlActions({
|
|
9127
|
+
activeConversationIdRef,
|
|
9128
|
+
agentActivityRuntime,
|
|
9129
|
+
draftByScopeKeyRef,
|
|
9130
|
+
isCurrentConversation,
|
|
9131
|
+
optimisticGoalControl,
|
|
9132
|
+
previewMode,
|
|
9133
|
+
sessionEngine,
|
|
9134
|
+
setDetailError,
|
|
9135
|
+
setDraftByScopeKey,
|
|
9136
|
+
setGoalClearNoticeSequence,
|
|
9137
|
+
setOptimisticGoalControl,
|
|
9138
|
+
workspaceId
|
|
9139
|
+
});
|
|
9140
|
+
const retryActivation = useCallback18(() => {
|
|
8950
9141
|
const agentSessionId = activeConversationIdRef.current;
|
|
8951
9142
|
if (!agentSessionId) {
|
|
8952
9143
|
return;
|
|
@@ -8966,7 +9157,7 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
8966
9157
|
isSessionMarkedNonResumable,
|
|
8967
9158
|
workspaceId
|
|
8968
9159
|
]);
|
|
8969
|
-
const executePrompt =
|
|
9160
|
+
const executePrompt = useCallback18(
|
|
8970
9161
|
(agentSessionId, content, displayPrompt, options) => {
|
|
8971
9162
|
const normalizedContent = normalizeAgentPromptContentBlocks(content);
|
|
8972
9163
|
if (!agentSessionId || normalizedContent.length === 0) {
|
|
@@ -9035,7 +9226,7 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9035
9226
|
submitTrace.clientSubmitId
|
|
9036
9227
|
)
|
|
9037
9228
|
);
|
|
9038
|
-
const accepted =
|
|
9229
|
+
const accepted = selectPendingSubmitsForSession3(
|
|
9039
9230
|
sessionEngine.getSnapshot(),
|
|
9040
9231
|
agentSessionId
|
|
9041
9232
|
).some((record) => record.clientSubmitId === submitTrace.clientSubmitId);
|
|
@@ -9094,7 +9285,7 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9094
9285
|
setDraftByScopeKey,
|
|
9095
9286
|
submittedDraftSnapshotsRef
|
|
9096
9287
|
]);
|
|
9097
|
-
const submitExistingPrompt =
|
|
9288
|
+
const submitExistingPrompt = useCallback18(
|
|
9098
9289
|
(agentSessionId, normalizedContent, displayPromptText, options) => {
|
|
9099
9290
|
if (isSessionMarkedNonResumable(agentSessionId)) {
|
|
9100
9291
|
setDetailError(
|
|
@@ -9123,61 +9314,7 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9123
9314
|
},
|
|
9124
9315
|
[activation, executePrompt, isSessionMarkedNonResumable, workspaceId]
|
|
9125
9316
|
);
|
|
9126
|
-
const
|
|
9127
|
-
(action, objective, submittedDraftScopeKey) => {
|
|
9128
|
-
if (previewMode) {
|
|
9129
|
-
return;
|
|
9130
|
-
}
|
|
9131
|
-
const agentSessionId = activeConversationIdRef.current;
|
|
9132
|
-
if (!agentSessionId) {
|
|
9133
|
-
return;
|
|
9134
|
-
}
|
|
9135
|
-
const submittedDraftSnapshot = submittedDraftScopeKey ? {
|
|
9136
|
-
sourceScopeKey: submittedDraftScopeKey,
|
|
9137
|
-
content: snapshotAgentComposerDraft(
|
|
9138
|
-
draftByScopeKeyRef.current[submittedDraftScopeKey] ?? emptyAgentComposerDraft()
|
|
9139
|
-
),
|
|
9140
|
-
targetAgentSessionId: agentSessionId
|
|
9141
|
-
} : null;
|
|
9142
|
-
setDetailError(null);
|
|
9143
|
-
void agentActivityRuntime.goalControl({
|
|
9144
|
-
workspaceId,
|
|
9145
|
-
agentSessionId,
|
|
9146
|
-
action,
|
|
9147
|
-
...objective !== void 0 ? { objective } : {}
|
|
9148
|
-
}).then(() => {
|
|
9149
|
-
if (submittedDraftSnapshot) {
|
|
9150
|
-
setDraftByScopeKey((current) => {
|
|
9151
|
-
const next = clearSubmittedDraftIfUnchanged({
|
|
9152
|
-
drafts: current,
|
|
9153
|
-
snapshot: submittedDraftSnapshot
|
|
9154
|
-
});
|
|
9155
|
-
draftByScopeKeyRef.current = next;
|
|
9156
|
-
return next;
|
|
9157
|
-
});
|
|
9158
|
-
}
|
|
9159
|
-
if (action !== "clear" || !isCurrentConversation(agentSessionId)) {
|
|
9160
|
-
return;
|
|
9161
|
-
}
|
|
9162
|
-
setGoalClearNoticeSequence((current) => current + 1);
|
|
9163
|
-
}).catch((error) => {
|
|
9164
|
-
if (!isCurrentConversation(agentSessionId)) {
|
|
9165
|
-
return;
|
|
9166
|
-
}
|
|
9167
|
-
setDetailError(getAgentGUIErrorMessage(error));
|
|
9168
|
-
});
|
|
9169
|
-
},
|
|
9170
|
-
[
|
|
9171
|
-
agentActivityRuntime,
|
|
9172
|
-
isCurrentConversation,
|
|
9173
|
-
previewMode,
|
|
9174
|
-
setDraftByScopeKey,
|
|
9175
|
-
setDetailError,
|
|
9176
|
-
setGoalClearNoticeSequence,
|
|
9177
|
-
workspaceId
|
|
9178
|
-
]
|
|
9179
|
-
);
|
|
9180
|
-
const submitPrompt = useCallback17(
|
|
9317
|
+
const submitPrompt = useCallback18(
|
|
9181
9318
|
(content, displayPrompt, options) => {
|
|
9182
9319
|
if (previewMode) {
|
|
9183
9320
|
return;
|
|
@@ -9258,6 +9395,15 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9258
9395
|
typedGoal ? false : void 0
|
|
9259
9396
|
);
|
|
9260
9397
|
if (activationResult) {
|
|
9398
|
+
if (typedGoal) {
|
|
9399
|
+
beginOptimisticGoalControl(
|
|
9400
|
+
activationResult.agentSessionId,
|
|
9401
|
+
typedGoal.action,
|
|
9402
|
+
typedGoal.objective,
|
|
9403
|
+
`goal-activation:${activationResult.requestId}`,
|
|
9404
|
+
true
|
|
9405
|
+
);
|
|
9406
|
+
}
|
|
9261
9407
|
draftByScopeKeyRef.current = clearSubmittedAgentGUIHomeDraft({
|
|
9262
9408
|
draftKey: homeDraftKey,
|
|
9263
9409
|
drafts: draftByScopeKeyRef.current,
|
|
@@ -9293,6 +9439,7 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9293
9439
|
},
|
|
9294
9440
|
[
|
|
9295
9441
|
agentActivityRuntime,
|
|
9442
|
+
beginOptimisticGoalControl,
|
|
9296
9443
|
conversationListQuery,
|
|
9297
9444
|
previewMode,
|
|
9298
9445
|
promptImagesSupported,
|
|
@@ -9306,7 +9453,7 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9306
9453
|
useEffect7(() => {
|
|
9307
9454
|
submitPromptRef.current = submitPrompt;
|
|
9308
9455
|
}, [submitPrompt]);
|
|
9309
|
-
const submitGuidancePrompt =
|
|
9456
|
+
const submitGuidancePrompt = useCallback18(
|
|
9310
9457
|
(content, displayPrompt) => {
|
|
9311
9458
|
const agentSessionId = activeConversationIdRef.current;
|
|
9312
9459
|
const normalizedContent = normalizeAgentPromptContentBlocks(content);
|
|
@@ -9336,10 +9483,10 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9336
9483
|
translate
|
|
9337
9484
|
]
|
|
9338
9485
|
);
|
|
9339
|
-
const showPromptImagesUnsupported =
|
|
9486
|
+
const showPromptImagesUnsupported = useCallback18(() => {
|
|
9340
9487
|
setDetailError(translate("agentHost.agentGui.promptImagesUnsupported"));
|
|
9341
9488
|
}, []);
|
|
9342
|
-
const submitInteractivePrompt =
|
|
9489
|
+
const submitInteractivePrompt = useCallback18(
|
|
9343
9490
|
(input2) => {
|
|
9344
9491
|
if (input2.action === PLAN_IMPLEMENTATION_ACTION_IMPLEMENT) {
|
|
9345
9492
|
planActionsRef.current.implement();
|
|
@@ -9387,13 +9534,13 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9387
9534
|
workspaceId
|
|
9388
9535
|
]
|
|
9389
9536
|
);
|
|
9390
|
-
const submitApprovalOption =
|
|
9537
|
+
const submitApprovalOption = useCallback18(
|
|
9391
9538
|
(requestId, optionId) => {
|
|
9392
9539
|
void submitInteractivePrompt({ requestId, optionId });
|
|
9393
9540
|
},
|
|
9394
9541
|
[submitInteractivePrompt]
|
|
9395
9542
|
);
|
|
9396
|
-
const interruptCurrentTurn =
|
|
9543
|
+
const interruptCurrentTurn = useCallback18(
|
|
9397
9544
|
(noRunningResponseMessage) => {
|
|
9398
9545
|
const agentSessionId = activeConversationIdRef.current;
|
|
9399
9546
|
const cancelStatus = agentSessionId ? selectEngineCancelState(sessionEngine.getSnapshot(), agentSessionId)?.status : null;
|
|
@@ -9401,23 +9548,19 @@ function useAgentGUISubmitInteractionActions(input) {
|
|
|
9401
9548
|
return;
|
|
9402
9549
|
}
|
|
9403
9550
|
void noRunningResponseMessage;
|
|
9404
|
-
sessionEngine.dispatch({
|
|
9405
|
-
agentSessionId,
|
|
9406
|
-
reason: "user_stop",
|
|
9407
|
-
type: "queue/suspended"
|
|
9408
|
-
});
|
|
9409
9551
|
setDetailError(null);
|
|
9410
9552
|
sessionEngine.dispatch({
|
|
9411
9553
|
agentSessionId,
|
|
9412
9554
|
awaitingTurnExpiresAtUnixMs: Date.now() + 3e4,
|
|
9413
9555
|
commandId: createAgentGUIConversationId(),
|
|
9414
9556
|
timeoutMs: 3e4,
|
|
9415
|
-
type: "session/
|
|
9557
|
+
type: "session/stopRequested",
|
|
9558
|
+
workspaceId
|
|
9416
9559
|
});
|
|
9417
9560
|
},
|
|
9418
|
-
[sessionEngine]
|
|
9561
|
+
[sessionEngine, workspaceId]
|
|
9419
9562
|
);
|
|
9420
|
-
const updateDraftContent =
|
|
9563
|
+
const updateDraftContent = useCallback18(
|
|
9421
9564
|
(draftContent, sourceScopeKey) => {
|
|
9422
9565
|
const agentSessionId = activeConversationIdRef.current;
|
|
9423
9566
|
const draftKey = sourceScopeKey ?? resolveAgentComposerDraftScopeKey({
|
|
@@ -9465,9 +9608,9 @@ function useAgentGUIOperationActions(input) {
|
|
|
9465
9608
|
...input,
|
|
9466
9609
|
createConversation
|
|
9467
9610
|
});
|
|
9468
|
-
const isSessionMarkedNonResumable =
|
|
9611
|
+
const isSessionMarkedNonResumable = useCallback19(
|
|
9469
9612
|
(agentSessionId) => {
|
|
9470
|
-
if (
|
|
9613
|
+
if (selectEngineSession3(input.sessionEngine.getSnapshot(), agentSessionId)?.resumable === false) {
|
|
9471
9614
|
return true;
|
|
9472
9615
|
}
|
|
9473
9616
|
const conversation = resolveConversationSummaryById(
|
|
@@ -10444,14 +10587,19 @@ function useAgentGUIControllerActions(actions) {
|
|
|
10444
10587
|
|
|
10445
10588
|
// agent-gui/agentGuiNode/controller/useAgentGUIConversationDetail.ts
|
|
10446
10589
|
import {
|
|
10447
|
-
selectEngineAvailableCommands
|
|
10590
|
+
selectEngineAvailableCommands,
|
|
10591
|
+
selectEngineTurnsForSession
|
|
10448
10592
|
} from "@tutti-os/agent-activity-core";
|
|
10449
|
-
import { useEffect as useEffect9, useMemo as useMemo11, useRef as
|
|
10593
|
+
import { useEffect as useEffect9, useMemo as useMemo11, useRef as useRef12 } from "react";
|
|
10450
10594
|
function useAgentGUIConversationDetail(input) {
|
|
10451
|
-
const projectionConversationRef =
|
|
10595
|
+
const projectionConversationRef = useRef12(null);
|
|
10452
10596
|
const activeCanonicalLiveTurn = Boolean(
|
|
10453
10597
|
input.activeTurn && input.activeTurn.phase !== "settled"
|
|
10454
10598
|
);
|
|
10599
|
+
const sessionTurns = useEngineSelector(
|
|
10600
|
+
input.sessionEngine,
|
|
10601
|
+
(state) => selectEngineTurnsForSession(state, input.activeConversationId)
|
|
10602
|
+
);
|
|
10455
10603
|
const projectionConversation = useMemo11(() => {
|
|
10456
10604
|
if (!input.activeConversation) {
|
|
10457
10605
|
projectionConversationRef.current = null;
|
|
@@ -10459,7 +10607,7 @@ function useAgentGUIConversationDetail(input) {
|
|
|
10459
10607
|
}
|
|
10460
10608
|
const current = input.activeConversation;
|
|
10461
10609
|
const previous = projectionConversationRef.current;
|
|
10462
|
-
if (previous && previous.id === current.id && previous.userId === current.userId && previous.provider === current.provider && previous.title === current.title && previous.titleFallback === current.titleFallback && previous.status === current.status && previous.cwd === current.cwd && previous.activeTurn === input.activeTurn) {
|
|
10610
|
+
if (previous && previous.id === current.id && previous.userId === current.userId && previous.provider === current.provider && previous.title === current.title && previous.titleFallback === current.titleFallback && previous.status === current.status && previous.cwd === current.cwd && previous.activeTurn === input.activeTurn && previous.sessionTurns === sessionTurns) {
|
|
10463
10611
|
return previous;
|
|
10464
10612
|
}
|
|
10465
10613
|
const next = {
|
|
@@ -10471,11 +10619,12 @@ function useAgentGUIConversationDetail(input) {
|
|
|
10471
10619
|
status: current.status,
|
|
10472
10620
|
cwd: current.cwd,
|
|
10473
10621
|
updatedAtUnixMs: current.updatedAtUnixMs,
|
|
10474
|
-
activeTurn: input.activeTurn
|
|
10622
|
+
activeTurn: input.activeTurn,
|
|
10623
|
+
sessionTurns
|
|
10475
10624
|
};
|
|
10476
10625
|
projectionConversationRef.current = next;
|
|
10477
10626
|
return next;
|
|
10478
|
-
}, [input.activeConversation, input.activeTurn]);
|
|
10627
|
+
}, [input.activeConversation, input.activeTurn, sessionTurns]);
|
|
10479
10628
|
const draftContent = input.activeConversationId ? input.draftByScopeKey[resolveAgentComposerDraftScopeKey({
|
|
10480
10629
|
agentSessionId: input.activeConversationId
|
|
10481
10630
|
})] ?? EMPTY_AGENT_COMPOSER_DRAFT : readAgentComposerDraftContent({
|
|
@@ -10533,7 +10682,7 @@ function useAgentGUIConversationDetail(input) {
|
|
|
10533
10682
|
}
|
|
10534
10683
|
return conversationModels.conversation;
|
|
10535
10684
|
}, [conversationDetail, conversationModels.conversation]);
|
|
10536
|
-
const diagnosticKeyRef =
|
|
10685
|
+
const diagnosticKeyRef = useRef12(null);
|
|
10537
10686
|
useEffect9(() => {
|
|
10538
10687
|
if (!input.activeConversationId || !conversation) {
|
|
10539
10688
|
diagnosticKeyRef.current = null;
|
|
@@ -10624,9 +10773,9 @@ function useAgentGUIConversationDetail(input) {
|
|
|
10624
10773
|
}
|
|
10625
10774
|
|
|
10626
10775
|
// agent-gui/agentGuiNode/controller/useAgentGUIConversationPresentation.ts
|
|
10627
|
-
import { useEffect as useEffect10, useMemo as useMemo12, useRef as
|
|
10776
|
+
import { useEffect as useEffect10, useMemo as useMemo12, useRef as useRef13 } from "react";
|
|
10628
10777
|
function useAgentGUIConversationPresentation(input) {
|
|
10629
|
-
const visibleConversationsRef =
|
|
10778
|
+
const visibleConversationsRef = useRef13(
|
|
10630
10779
|
null
|
|
10631
10780
|
);
|
|
10632
10781
|
const conversationProjection = useMemo12(() => {
|
|
@@ -10657,7 +10806,7 @@ function useAgentGUIConversationPresentation(input) {
|
|
|
10657
10806
|
input.userProjects
|
|
10658
10807
|
]);
|
|
10659
10808
|
const visibleConversations = conversationProjection.visibleConversations;
|
|
10660
|
-
const activeConversationRef =
|
|
10809
|
+
const activeConversationRef = useRef13(
|
|
10661
10810
|
null
|
|
10662
10811
|
);
|
|
10663
10812
|
const activeConversation = useMemo12(() => {
|
|
@@ -10786,14 +10935,14 @@ function useAgentGUIConversationPresentation(input) {
|
|
|
10786
10935
|
|
|
10787
10936
|
// agent-gui/agentGuiNode/controller/useAgentGUIProviderHome.ts
|
|
10788
10937
|
import {
|
|
10789
|
-
useCallback as
|
|
10938
|
+
useCallback as useCallback20,
|
|
10790
10939
|
useEffect as useEffect11,
|
|
10791
|
-
useRef as
|
|
10940
|
+
useRef as useRef14
|
|
10792
10941
|
} from "react";
|
|
10793
10942
|
function useAgentGUIProviderHome(input) {
|
|
10794
|
-
const inputRef =
|
|
10943
|
+
const inputRef = useRef14(input);
|
|
10795
10944
|
inputRef.current = input;
|
|
10796
|
-
const resolveDefaultHomeComposerTarget =
|
|
10945
|
+
const resolveDefaultHomeComposerTarget = useCallback20(() => {
|
|
10797
10946
|
const current = inputRef.current;
|
|
10798
10947
|
const defaultTargetId = current.defaultAgentTargetId?.trim() ?? "";
|
|
10799
10948
|
const explicitDefaultTarget = defaultTargetId ? current.normalizedProviderTargets.find(
|
|
@@ -10803,7 +10952,7 @@ function useAgentGUIProviderHome(input) {
|
|
|
10803
10952
|
(target) => target.disabled !== true
|
|
10804
10953
|
) ?? current.normalizedProviderTargets[0] ?? null;
|
|
10805
10954
|
}, []);
|
|
10806
|
-
const resetHomeComposerAgentTargetToDefault =
|
|
10955
|
+
const resetHomeComposerAgentTargetToDefault = useCallback20(() => {
|
|
10807
10956
|
const currentInput = inputRef.current;
|
|
10808
10957
|
if (currentInput.previewMode) return;
|
|
10809
10958
|
const nextTarget = resolveDefaultHomeComposerTarget();
|
|
@@ -10837,13 +10986,8 @@ function useAgentGUIProviderHome(input) {
|
|
|
10837
10986
|
...nextTargetData.data,
|
|
10838
10987
|
lastActiveAgentSessionId: null
|
|
10839
10988
|
};
|
|
10840
|
-
if (nextTarget.disabled !== true) {
|
|
10841
|
-
currentInput.loadComposerOptionsForTarget(nextTargetData, {
|
|
10842
|
-
force: true
|
|
10843
|
-
});
|
|
10844
|
-
}
|
|
10845
10989
|
}, [resolveDefaultHomeComposerTarget]);
|
|
10846
|
-
const updateConversationFilter =
|
|
10990
|
+
const updateConversationFilter = useCallback20(
|
|
10847
10991
|
(filter) => {
|
|
10848
10992
|
const current = inputRef.current;
|
|
10849
10993
|
const nextFilter = normalizeAgentGUIConversationFilter(filter);
|
|
@@ -10854,7 +10998,7 @@ function useAgentGUIProviderHome(input) {
|
|
|
10854
10998
|
},
|
|
10855
10999
|
[resetHomeComposerAgentTargetToDefault]
|
|
10856
11000
|
);
|
|
10857
|
-
const selectHomeComposerAgentTarget =
|
|
11001
|
+
const selectHomeComposerAgentTarget = useCallback20(
|
|
10858
11002
|
(selection) => {
|
|
10859
11003
|
const currentInput = inputRef.current;
|
|
10860
11004
|
if (currentInput.previewMode) return;
|
|
@@ -10869,11 +11013,6 @@ function useAgentGUIProviderHome(input) {
|
|
|
10869
11013
|
const nextTargetIsExplicit = currentInput.normalizedExplicitProviderTargets.some(
|
|
10870
11014
|
(target) => target.provider === nextTarget.provider && target.targetId === nextTarget.targetId && agentGUIAgentTargetRefsEqual(target.ref, nextTarget.ref)
|
|
10871
11015
|
);
|
|
10872
|
-
const nextTargetData = composerTargetDataFromProviderTarget({
|
|
10873
|
-
current: currentInput.dataRef.current,
|
|
10874
|
-
isExplicit: nextTargetIsExplicit,
|
|
10875
|
-
target: nextTarget
|
|
10876
|
-
});
|
|
10877
11016
|
const shouldSyncScopedRailFilter = currentInput.conversationFilterRef.current.kind === "agentTarget";
|
|
10878
11017
|
currentInput.setHomeComposerTargetOverride(nextTarget);
|
|
10879
11018
|
if (shouldSyncScopedRailFilter) {
|
|
@@ -10917,11 +11056,6 @@ function useAgentGUIProviderHome(input) {
|
|
|
10917
11056
|
currentInput.dataRef.current = nextData;
|
|
10918
11057
|
return nextData;
|
|
10919
11058
|
});
|
|
10920
|
-
if (nextTarget.disabled !== true) {
|
|
10921
|
-
currentInput.loadComposerOptionsForTarget(nextTargetData, {
|
|
10922
|
-
force: true
|
|
10923
|
-
});
|
|
10924
|
-
}
|
|
10925
11059
|
},
|
|
10926
11060
|
[]
|
|
10927
11061
|
);
|
|
@@ -10957,7 +11091,7 @@ function useAgentGUIProviderHome(input) {
|
|
|
10957
11091
|
input.providerReadinessGates,
|
|
10958
11092
|
selectHomeComposerAgentTarget
|
|
10959
11093
|
]);
|
|
10960
|
-
const selectConversationFilterTarget =
|
|
11094
|
+
const selectConversationFilterTarget = useCallback20(
|
|
10961
11095
|
(selection) => {
|
|
10962
11096
|
const current = inputRef.current;
|
|
10963
11097
|
const nextTarget = resolveAgentGUIAgentTarget({
|
|
@@ -11095,13 +11229,27 @@ function useAgentGUISessionPresentation(input) {
|
|
|
11095
11229
|
const activeSessionResumable = input.activeEngineSession?.resumable ?? input.activeConversation?.resumable ?? input.activeSessionState?.resumable;
|
|
11096
11230
|
const activeConversationRequiresResume = input.activeConversationId !== null && input.activationState !== "active";
|
|
11097
11231
|
const activeConversationResumeUnavailable = activeConversationRequiresResume && activeSessionResumable === false;
|
|
11098
|
-
const sessionChromeRawState = useMemo13(
|
|
11099
|
-
|
|
11100
|
-
|
|
11101
|
-
|
|
11102
|
-
|
|
11103
|
-
|
|
11104
|
-
|
|
11232
|
+
const sessionChromeRawState = useMemo13(() => {
|
|
11233
|
+
const optimisticGoalControl = unresolvedOptimisticGoalControl(
|
|
11234
|
+
input.optimisticGoalControl,
|
|
11235
|
+
input.activeConversationId,
|
|
11236
|
+
input.activeEngineSession
|
|
11237
|
+
);
|
|
11238
|
+
const agentSessionId = input.activeEngineSession?.agentSessionId ?? optimisticGoalControl?.agentSessionId;
|
|
11239
|
+
if (!agentSessionId) {
|
|
11240
|
+
return null;
|
|
11241
|
+
}
|
|
11242
|
+
return {
|
|
11243
|
+
agentSessionId,
|
|
11244
|
+
goal: optimisticGoalControl ? optimisticGoalControl.goal : input.activeEngineSession?.goal ?? null,
|
|
11245
|
+
goalIsOptimistic: optimisticGoalControl !== null
|
|
11246
|
+
};
|
|
11247
|
+
}, [
|
|
11248
|
+
input.activeConversationId,
|
|
11249
|
+
input.activeEngineSession?.agentSessionId,
|
|
11250
|
+
input.activeEngineSession?.goal,
|
|
11251
|
+
input.optimisticGoalControl
|
|
11252
|
+
]);
|
|
11105
11253
|
const sessionChrome = useMemo13(() => {
|
|
11106
11254
|
const normalizedError = input.activationError?.trim() ?? "";
|
|
11107
11255
|
const authState = input.activeSessionState?.authState?.trim() ?? "";
|
|
@@ -11586,7 +11734,7 @@ import {
|
|
|
11586
11734
|
selectEnginePendingInteractions,
|
|
11587
11735
|
selectEnginePromptQueue,
|
|
11588
11736
|
selectEnginePromptQueueError,
|
|
11589
|
-
selectEngineSession as
|
|
11737
|
+
selectEngineSession as selectEngineSession4,
|
|
11590
11738
|
selectEngineSessionDeleted,
|
|
11591
11739
|
selectEngineSessionDetailHydrated as selectEngineSessionDetailHydrated2,
|
|
11592
11740
|
selectEngineSessionDetailLoading,
|
|
@@ -11595,9 +11743,9 @@ import {
|
|
|
11595
11743
|
selectEngineSessionReconcile as selectEngineSessionReconcile2,
|
|
11596
11744
|
selectEngineSessionSettingsUpdate as selectEngineSessionSettingsUpdate2,
|
|
11597
11745
|
selectEngineSubmitAvailability,
|
|
11598
|
-
selectLatestActivationForSession as
|
|
11746
|
+
selectLatestActivationForSession as selectLatestActivationForSession6,
|
|
11599
11747
|
selectLatestPendingSubmitForSession,
|
|
11600
|
-
selectPendingSubmitsForSession as
|
|
11748
|
+
selectPendingSubmitsForSession as selectPendingSubmitsForSession4,
|
|
11601
11749
|
selectSessionHasUnconfirmedSubmit,
|
|
11602
11750
|
selectSessionIsSubmitting
|
|
11603
11751
|
} from "@tutti-os/agent-activity-core";
|
|
@@ -11623,7 +11771,7 @@ function useAgentGUISessionEngineState(input) {
|
|
|
11623
11771
|
);
|
|
11624
11772
|
const activePendingSubmits = useEngineSelector(
|
|
11625
11773
|
sessionEngine,
|
|
11626
|
-
(state) =>
|
|
11774
|
+
(state) => selectPendingSubmitsForSession4(state, activeConversationId),
|
|
11627
11775
|
pendingSubmitRecordListsEqual
|
|
11628
11776
|
);
|
|
11629
11777
|
const activeLatestPendingSubmit = useEngineSelector(
|
|
@@ -11632,7 +11780,7 @@ function useAgentGUISessionEngineState(input) {
|
|
|
11632
11780
|
);
|
|
11633
11781
|
const activePendingActivation = useEngineSelector(
|
|
11634
11782
|
sessionEngine,
|
|
11635
|
-
(state) =>
|
|
11783
|
+
(state) => selectLatestActivationForSession6(state, activeConversationId)
|
|
11636
11784
|
);
|
|
11637
11785
|
const isCreatingConversation = isPendingNewConversationActivation(
|
|
11638
11786
|
activePendingActivation
|
|
@@ -11651,7 +11799,7 @@ function useAgentGUISessionEngineState(input) {
|
|
|
11651
11799
|
);
|
|
11652
11800
|
const activeEngineSession = useEngineSelector(
|
|
11653
11801
|
sessionEngine,
|
|
11654
|
-
(state) =>
|
|
11802
|
+
(state) => selectEngineSession4(state, activeConversationId)
|
|
11655
11803
|
);
|
|
11656
11804
|
const activeSessionReconcile = useEngineSelector(
|
|
11657
11805
|
sessionEngine,
|
|
@@ -11774,15 +11922,15 @@ function useAgentGUISessionEngineState(input) {
|
|
|
11774
11922
|
|
|
11775
11923
|
// agent-gui/agentGuiNode/controller/useAgentGUISessionDetailTransport.ts
|
|
11776
11924
|
import {
|
|
11777
|
-
selectLatestActivationForSession as
|
|
11925
|
+
selectLatestActivationForSession as selectLatestActivationForSession7
|
|
11778
11926
|
} from "@tutti-os/agent-activity-core";
|
|
11779
|
-
import { useCallback as
|
|
11927
|
+
import { useCallback as useCallback24, useMemo as useMemo17 } from "react";
|
|
11780
11928
|
|
|
11781
11929
|
// contexts/workspace/presentation/renderer/agentSessions/useAgentSessionControllerState.ts
|
|
11782
|
-
import { useCallback as
|
|
11930
|
+
import { useCallback as useCallback23 } from "react";
|
|
11783
11931
|
|
|
11784
11932
|
// contexts/workspace/presentation/renderer/agentSessions/useAgentSessionPagingState.ts
|
|
11785
|
-
import { useCallback as
|
|
11933
|
+
import { useCallback as useCallback21, useRef as useRef15, useState as useState5 } from "react";
|
|
11786
11934
|
var EMPTY_ENTRY = {
|
|
11787
11935
|
error: null,
|
|
11788
11936
|
isLoadingMessages: false,
|
|
@@ -11790,9 +11938,9 @@ var EMPTY_ENTRY = {
|
|
|
11790
11938
|
};
|
|
11791
11939
|
function useAgentSessionPagingState() {
|
|
11792
11940
|
const [entries, setEntries] = useState5({});
|
|
11793
|
-
const entriesRef =
|
|
11941
|
+
const entriesRef = useRef15(entries);
|
|
11794
11942
|
entriesRef.current = entries;
|
|
11795
|
-
const update =
|
|
11943
|
+
const update = useCallback21(
|
|
11796
11944
|
(ref, updater) => {
|
|
11797
11945
|
const key = sessionKey(ref);
|
|
11798
11946
|
if (!key) return;
|
|
@@ -11804,11 +11952,11 @@ function useAgentSessionPagingState() {
|
|
|
11804
11952
|
},
|
|
11805
11953
|
[]
|
|
11806
11954
|
);
|
|
11807
|
-
const get =
|
|
11955
|
+
const get = useCallback21((ref) => {
|
|
11808
11956
|
const key = sessionKey(ref);
|
|
11809
11957
|
return key ? entriesRef.current[key] ?? null : null;
|
|
11810
11958
|
}, []);
|
|
11811
|
-
const remove =
|
|
11959
|
+
const remove = useCallback21((ref) => {
|
|
11812
11960
|
const key = sessionKey(ref);
|
|
11813
11961
|
if (!key) return;
|
|
11814
11962
|
setEntries((current) => {
|
|
@@ -11818,11 +11966,11 @@ function useAgentSessionPagingState() {
|
|
|
11818
11966
|
return next;
|
|
11819
11967
|
});
|
|
11820
11968
|
}, []);
|
|
11821
|
-
const flag =
|
|
11969
|
+
const flag = useCallback21(
|
|
11822
11970
|
(field, ref, value) => update(ref, (entry) => ({ ...entry, [field]: value })),
|
|
11823
11971
|
[update]
|
|
11824
11972
|
);
|
|
11825
|
-
const setError =
|
|
11973
|
+
const setError = useCallback21(
|
|
11826
11974
|
(ref, error) => update(ref, (entry) => ({ ...entry, error })),
|
|
11827
11975
|
[update]
|
|
11828
11976
|
);
|
|
@@ -11836,7 +11984,7 @@ function sessionKey(ref) {
|
|
|
11836
11984
|
}
|
|
11837
11985
|
|
|
11838
11986
|
// contexts/workspace/presentation/renderer/agentSessions/useAgentSessionTransport.ts
|
|
11839
|
-
import { useCallback as
|
|
11987
|
+
import { useCallback as useCallback22, useRef as useRef16, useState as useState6 } from "react";
|
|
11840
11988
|
var EMPTY_ENTRY2 = {
|
|
11841
11989
|
olderMessages: [],
|
|
11842
11990
|
hasOlderMessages: false,
|
|
@@ -11844,9 +11992,9 @@ var EMPTY_ENTRY2 = {
|
|
|
11844
11992
|
};
|
|
11845
11993
|
function useAgentSessionTransport() {
|
|
11846
11994
|
const [entries, setEntries] = useState6({});
|
|
11847
|
-
const entriesRef =
|
|
11995
|
+
const entriesRef = useRef16(entries);
|
|
11848
11996
|
entriesRef.current = entries;
|
|
11849
|
-
const update =
|
|
11997
|
+
const update = useCallback22(
|
|
11850
11998
|
(ref, updater) => {
|
|
11851
11999
|
const key = sessionKey2(ref);
|
|
11852
12000
|
if (!key) return;
|
|
@@ -11858,11 +12006,11 @@ function useAgentSessionTransport() {
|
|
|
11858
12006
|
},
|
|
11859
12007
|
[]
|
|
11860
12008
|
);
|
|
11861
|
-
const get =
|
|
12009
|
+
const get = useCallback22((ref) => {
|
|
11862
12010
|
const key = sessionKey2(ref);
|
|
11863
12011
|
return key ? entriesRef.current[key] ?? null : null;
|
|
11864
12012
|
}, []);
|
|
11865
|
-
const remove =
|
|
12013
|
+
const remove = useCallback22((ref) => {
|
|
11866
12014
|
const key = sessionKey2(ref);
|
|
11867
12015
|
if (!key) return;
|
|
11868
12016
|
setEntries((current) => {
|
|
@@ -11872,7 +12020,7 @@ function useAgentSessionTransport() {
|
|
|
11872
12020
|
return next;
|
|
11873
12021
|
});
|
|
11874
12022
|
}, []);
|
|
11875
|
-
const mergeOlder =
|
|
12023
|
+
const mergeOlder = useCallback22(
|
|
11876
12024
|
(ref, messages, options = {}) => update(ref, (entry) => {
|
|
11877
12025
|
const olderMessages = mergeWorkspaceAgentMessages(
|
|
11878
12026
|
entry.olderMessages,
|
|
@@ -11887,7 +12035,7 @@ function useAgentSessionTransport() {
|
|
|
11887
12035
|
}),
|
|
11888
12036
|
[update]
|
|
11889
12037
|
);
|
|
11890
|
-
const resetOlder =
|
|
12038
|
+
const resetOlder = useCallback22(
|
|
11891
12039
|
(ref) => update(ref, (entry) => ({
|
|
11892
12040
|
...entry,
|
|
11893
12041
|
olderMessages: [],
|
|
@@ -11919,7 +12067,7 @@ function oldestVersion(messages) {
|
|
|
11919
12067
|
function useAgentSessionControllerState(activeRef, canonicalMessages = []) {
|
|
11920
12068
|
const transport = useAgentSessionTransport();
|
|
11921
12069
|
const paging = useAgentSessionPagingState();
|
|
11922
|
-
const getAgentSessionView =
|
|
12070
|
+
const getAgentSessionView = useCallback23(
|
|
11923
12071
|
(ref) => {
|
|
11924
12072
|
const transportEntry = transport.get(ref);
|
|
11925
12073
|
const pagingEntry = paging.get(ref);
|
|
@@ -11938,18 +12086,18 @@ function useAgentSessionControllerState(activeRef, canonicalMessages = []) {
|
|
|
11938
12086
|
},
|
|
11939
12087
|
[paging.get, transport.get]
|
|
11940
12088
|
);
|
|
11941
|
-
const deleteAgentSessionView =
|
|
12089
|
+
const deleteAgentSessionView = useCallback23(
|
|
11942
12090
|
(ref) => {
|
|
11943
12091
|
transport.remove(ref);
|
|
11944
12092
|
paging.remove(ref);
|
|
11945
12093
|
},
|
|
11946
12094
|
[paging.remove, transport.remove]
|
|
11947
12095
|
);
|
|
11948
|
-
const setAgentSessionViewMessagesLoading =
|
|
12096
|
+
const setAgentSessionViewMessagesLoading = useCallback23(
|
|
11949
12097
|
(ref, value) => paging.flag("isLoadingMessages", ref, value),
|
|
11950
12098
|
[paging.flag]
|
|
11951
12099
|
);
|
|
11952
|
-
const setAgentSessionViewOlderMessagesLoading =
|
|
12100
|
+
const setAgentSessionViewOlderMessagesLoading = useCallback23(
|
|
11953
12101
|
(ref, value) => paging.flag("isLoadingOlderMessages", ref, value),
|
|
11954
12102
|
[paging.flag]
|
|
11955
12103
|
);
|
|
@@ -12004,7 +12152,7 @@ function useAgentGUISessionDetailTransport(input) {
|
|
|
12004
12152
|
syncConversationListProjectionRef,
|
|
12005
12153
|
workspaceId
|
|
12006
12154
|
} = input;
|
|
12007
|
-
const sessionViewRef =
|
|
12155
|
+
const sessionViewRef = useCallback24(
|
|
12008
12156
|
(agentSessionId) => ({
|
|
12009
12157
|
workspaceId,
|
|
12010
12158
|
agentSessionId,
|
|
@@ -12016,7 +12164,7 @@ function useAgentGUISessionDetailTransport(input) {
|
|
|
12016
12164
|
sessionViewRef(activeConversationId),
|
|
12017
12165
|
activeConversationId ? agentActivitySnapshot.sessionMessagesById[activeConversationId] ?? [] : []
|
|
12018
12166
|
);
|
|
12019
|
-
const resolveSessionMessages =
|
|
12167
|
+
const resolveSessionMessages = useCallback24(
|
|
12020
12168
|
(agentSessionId) => {
|
|
12021
12169
|
const normalized = agentSessionId?.trim() ?? "";
|
|
12022
12170
|
if (!normalized) return EMPTY_AGENT_GUI_MESSAGES;
|
|
@@ -12079,7 +12227,7 @@ function useAgentGUISessionDetailTransport(input) {
|
|
|
12079
12227
|
windowHasTurnMissingUserPrompt
|
|
12080
12228
|
},
|
|
12081
12229
|
reload: {
|
|
12082
|
-
getActivationStatus: (agentSessionId) =>
|
|
12230
|
+
getActivationStatus: (agentSessionId) => selectLatestActivationForSession7(
|
|
12083
12231
|
sessionEngine.getSnapshot(),
|
|
12084
12232
|
agentSessionId
|
|
12085
12233
|
)?.status ?? null,
|
|
@@ -12096,7 +12244,7 @@ function useAgentGUISessionDetailTransport(input) {
|
|
|
12096
12244
|
workspaceId
|
|
12097
12245
|
});
|
|
12098
12246
|
reloadSelectedConversationRef.current = paging.reloadSelectedConversation;
|
|
12099
|
-
const markSelectedConversationDetailPending =
|
|
12247
|
+
const markSelectedConversationDetailPending = useCallback24(
|
|
12100
12248
|
(agentSessionId) => {
|
|
12101
12249
|
const normalized = agentSessionId.trim();
|
|
12102
12250
|
if (!normalized) return null;
|
|
@@ -12121,7 +12269,7 @@ function useAgentGUISessionDetailTransport(input) {
|
|
|
12121
12269
|
}
|
|
12122
12270
|
|
|
12123
12271
|
// agent-gui/agentGuiNode/controller/useAgentGUILocalState.ts
|
|
12124
|
-
import { useRef as
|
|
12272
|
+
import { useRef as useRef17, useState as useState7 } from "react";
|
|
12125
12273
|
function useAgentGUILocalState({
|
|
12126
12274
|
data,
|
|
12127
12275
|
userProjectsApi
|
|
@@ -12140,7 +12288,7 @@ function useAgentGUILocalState({
|
|
|
12140
12288
|
data.lastActiveAgentSessionId === null
|
|
12141
12289
|
);
|
|
12142
12290
|
const [draftByScopeKey, setDraftByScopeKey] = useState7({});
|
|
12143
|
-
const submittedDraftSnapshotsRef =
|
|
12291
|
+
const submittedDraftSnapshotsRef = useRef17({});
|
|
12144
12292
|
const [draftSettingsBySessionId, setDraftSettingsBySessionId] = useState7({});
|
|
12145
12293
|
const [isLoadingMessages, setIsLoadingMessages] = useState7(false);
|
|
12146
12294
|
const [isDeletingConversation, setIsDeletingConversation] = useState7(false);
|
|
@@ -12153,6 +12301,7 @@ function useAgentGUILocalState({
|
|
|
12153
12301
|
const [listError, setListError] = useState7(null);
|
|
12154
12302
|
const [detailError, setDetailError] = useState7(null);
|
|
12155
12303
|
const [goalClearNoticeSequence, setGoalClearNoticeSequence] = useState7(0);
|
|
12304
|
+
const [optimisticGoalControl, setOptimisticGoalControl] = useState7(null);
|
|
12156
12305
|
return {
|
|
12157
12306
|
activeConversationId,
|
|
12158
12307
|
detailError,
|
|
@@ -12165,6 +12314,7 @@ function useAgentGUILocalState({
|
|
|
12165
12314
|
isDeletingProjectConversations,
|
|
12166
12315
|
isLoadingMessages,
|
|
12167
12316
|
listError,
|
|
12317
|
+
optimisticGoalControl,
|
|
12168
12318
|
pendingDeleteConversation,
|
|
12169
12319
|
pendingDeleteProjectConversations,
|
|
12170
12320
|
selectedProjectPath,
|
|
@@ -12179,6 +12329,7 @@ function useAgentGUILocalState({
|
|
|
12179
12329
|
setIsDeletingProjectConversations,
|
|
12180
12330
|
setIsLoadingMessages,
|
|
12181
12331
|
setListError,
|
|
12332
|
+
setOptimisticGoalControl,
|
|
12182
12333
|
setPendingDeleteConversation,
|
|
12183
12334
|
setPendingDeleteProjectConversations,
|
|
12184
12335
|
setSelectedProjectPath,
|
|
@@ -12318,9 +12469,9 @@ function useAgentGUINodeController({
|
|
|
12318
12469
|
)
|
|
12319
12470
|
)
|
|
12320
12471
|
);
|
|
12321
|
-
const updateComposerSettingsRef =
|
|
12472
|
+
const updateComposerSettingsRef = useRef18(() => {
|
|
12322
12473
|
});
|
|
12323
|
-
const planActionsRef =
|
|
12474
|
+
const planActionsRef = useRef18({ implement: () => {
|
|
12324
12475
|
}, feedback: () => {
|
|
12325
12476
|
}, skip: () => {
|
|
12326
12477
|
} });
|
|
@@ -12339,7 +12490,7 @@ function useAgentGUINodeController({
|
|
|
12339
12490
|
defaultReasoningEffort,
|
|
12340
12491
|
providerComposerOptions
|
|
12341
12492
|
} = composerCapabilities;
|
|
12342
|
-
const planImplementationTurnIdRef =
|
|
12493
|
+
const planImplementationTurnIdRef = useRef18(null);
|
|
12343
12494
|
const accountProfilesByUserId = useAccountStore(
|
|
12344
12495
|
(state) => state.profilesByUserId
|
|
12345
12496
|
);
|
|
@@ -12367,7 +12518,6 @@ function useAgentGUINodeController({
|
|
|
12367
12518
|
const {
|
|
12368
12519
|
activeConversationIdRef,
|
|
12369
12520
|
agentActivitySnapshotRef,
|
|
12370
|
-
composerOptionsProjectKeyRef,
|
|
12371
12521
|
conversationIdsRef,
|
|
12372
12522
|
conversationsRef,
|
|
12373
12523
|
dataRef,
|
|
@@ -12440,7 +12590,7 @@ function useAgentGUINodeController({
|
|
|
12440
12590
|
getErrorCode: getAgentGUIErrorCode
|
|
12441
12591
|
});
|
|
12442
12592
|
const activeConversationLiveState = activation.stateFor(activeConversationId);
|
|
12443
|
-
const removeConversations =
|
|
12593
|
+
const removeConversations = useCallback25(
|
|
12444
12594
|
(conversationIds) => {
|
|
12445
12595
|
for (const agentSessionId of conversationIds) {
|
|
12446
12596
|
sessionEngine.dispatch({
|
|
@@ -12451,7 +12601,7 @@ function useAgentGUINodeController({
|
|
|
12451
12601
|
},
|
|
12452
12602
|
[sessionEngine]
|
|
12453
12603
|
);
|
|
12454
|
-
const setUserProjectsSnapshot =
|
|
12604
|
+
const setUserProjectsSnapshot = useCallback25(
|
|
12455
12605
|
(projects) => {
|
|
12456
12606
|
setUserProjects(
|
|
12457
12607
|
(current) => areAgentGUIUserProjectsEqual(current, projects) ? current : [...projects]
|
|
@@ -12528,7 +12678,7 @@ function useAgentGUINodeController({
|
|
|
12528
12678
|
const selectConversation = conversationSelection.selectConversation;
|
|
12529
12679
|
const syncConversationListProjection = conversationSelection.syncConversationListProjection;
|
|
12530
12680
|
syncConversationListProjectionRef.current = syncConversationListProjection;
|
|
12531
|
-
const updateSelectedProjectPath =
|
|
12681
|
+
const updateSelectedProjectPath = useCallback25(
|
|
12532
12682
|
(path, metadata) => {
|
|
12533
12683
|
const normalizedPath = normalizeAgentComposerDraftProjectPath(path);
|
|
12534
12684
|
const project = metadata?.project;
|
|
@@ -12594,11 +12744,10 @@ function useAgentGUINodeController({
|
|
|
12594
12744
|
transientConversation,
|
|
12595
12745
|
workspaceId
|
|
12596
12746
|
});
|
|
12597
|
-
const {
|
|
12747
|
+
const { loadDraftComposerOptions } = useAgentGUIComposerOptionsSync({
|
|
12598
12748
|
activeConversationId,
|
|
12599
12749
|
activeConversationIdRef,
|
|
12600
12750
|
agentActivityRuntime,
|
|
12601
|
-
composerOptionsProjectKeyRef,
|
|
12602
12751
|
composerTargetData,
|
|
12603
12752
|
conversationFilter,
|
|
12604
12753
|
currentUserId,
|
|
@@ -12699,7 +12848,6 @@ function useAgentGUINodeController({
|
|
|
12699
12848
|
isCreatingConversation,
|
|
12700
12849
|
isLoadingConversations,
|
|
12701
12850
|
isLoadingMessages,
|
|
12702
|
-
loadComposerOptionsForTarget,
|
|
12703
12851
|
normalizedComingSoonProviders,
|
|
12704
12852
|
operationActions,
|
|
12705
12853
|
persistActiveConversation,
|
|
@@ -12722,10 +12870,10 @@ function useAgentGUINodeController({
|
|
|
12722
12870
|
|
|
12723
12871
|
// agent-gui/agentGuiNode/AgentGUINodeView.tsx
|
|
12724
12872
|
import {
|
|
12725
|
-
useCallback as
|
|
12873
|
+
useCallback as useCallback49,
|
|
12726
12874
|
useEffect as useEffect37,
|
|
12727
12875
|
useMemo as useMemo37,
|
|
12728
|
-
useRef as
|
|
12876
|
+
useRef as useRef44,
|
|
12729
12877
|
useState as useState36
|
|
12730
12878
|
} from "react";
|
|
12731
12879
|
import { TooltipProvider as TooltipProvider4 } from "@tutti-os/ui-system";
|
|
@@ -12922,6 +13070,7 @@ var styles = {
|
|
|
12922
13070
|
projectRailTitle: "agent-gui-node__project-rail-title",
|
|
12923
13071
|
providerRail: "agent-gui-node__provider-rail",
|
|
12924
13072
|
providerRailAvatar: "agent-gui-node__provider-rail-avatar",
|
|
13073
|
+
providerRailBetaBadge: "agent-gui-node__provider-rail-beta-badge",
|
|
12925
13074
|
providerRailAvatarIcon: "agent-gui-node__provider-rail-avatar-icon",
|
|
12926
13075
|
providerRailAvatarImage: "agent-gui-node__provider-rail-avatar-image",
|
|
12927
13076
|
emptyHeroIconSlot: "agent-gui-node__empty-hero-icon-slot",
|
|
@@ -12961,7 +13110,7 @@ var styles = {
|
|
|
12961
13110
|
var AgentGUINode_styles_default = styles;
|
|
12962
13111
|
|
|
12963
13112
|
// agent-gui/agentGuiNode/view/agentGUIViewUtils.ts
|
|
12964
|
-
import { useCallback as
|
|
13113
|
+
import { useCallback as useCallback26, useLayoutEffect, useMemo as useMemo19, useRef as useRef19 } from "react";
|
|
12965
13114
|
function objectRecord(value) {
|
|
12966
13115
|
return value && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
12967
13116
|
}
|
|
@@ -12979,14 +13128,14 @@ function stringValue3(value) {
|
|
|
12979
13128
|
return typeof value === "string" ? value : "";
|
|
12980
13129
|
}
|
|
12981
13130
|
function useStableEventCallback(callback) {
|
|
12982
|
-
const callbackRef =
|
|
13131
|
+
const callbackRef = useRef19(callback);
|
|
12983
13132
|
useLayoutEffect(() => {
|
|
12984
13133
|
callbackRef.current = callback;
|
|
12985
13134
|
}, [callback]);
|
|
12986
|
-
return
|
|
13135
|
+
return useCallback26((...args) => callbackRef.current(...args), []);
|
|
12987
13136
|
}
|
|
12988
13137
|
function useOptionalStableEventCallback(callback) {
|
|
12989
|
-
const callbackRef =
|
|
13138
|
+
const callbackRef = useRef19(callback);
|
|
12990
13139
|
useLayoutEffect(() => {
|
|
12991
13140
|
callbackRef.current = callback;
|
|
12992
13141
|
}, [callback]);
|
|
@@ -13017,7 +13166,7 @@ function conversationPlainTitle(conversation, labels, uiLanguage) {
|
|
|
13017
13166
|
}
|
|
13018
13167
|
|
|
13019
13168
|
// agent-gui/agentGuiNode/view/AgentGUIAccountConfig.tsx
|
|
13020
|
-
import { memo, useCallback as
|
|
13169
|
+
import { memo, useCallback as useCallback27, useEffect as useEffect16, useState as useState9 } from "react";
|
|
13021
13170
|
import {
|
|
13022
13171
|
Coins,
|
|
13023
13172
|
Crown as Crown2,
|
|
@@ -13252,7 +13401,7 @@ var AgentGUIAccountRailMenu = memo(function AgentGUIAccountRailMenu2({
|
|
|
13252
13401
|
const membershipLabel = accountMenuState.membershipLabel.trim() || labels.accountMenuFree;
|
|
13253
13402
|
const creditsLabel = accountMenuState.loading && !accountMenuState.creditsLabel ? labels.accountMenuLoading : accountMenuState.creditsLabel ?? labels.accountMenuUnavailable;
|
|
13254
13403
|
const errorLabel = accountMenuState.error || (accountMenuState.partialError ? labels.accountMenuDataUnavailable : null);
|
|
13255
|
-
const openExternal =
|
|
13404
|
+
const openExternal = useCallback27(
|
|
13256
13405
|
(url) => {
|
|
13257
13406
|
accountMenuState.onOpenExternal(url);
|
|
13258
13407
|
},
|
|
@@ -13628,9 +13777,9 @@ function AgentGUIConfigMenu({
|
|
|
13628
13777
|
// agent-gui/agentGuiNode/view/AgentGUIProviderRail.tsx
|
|
13629
13778
|
import {
|
|
13630
13779
|
memo as memo4,
|
|
13631
|
-
useCallback as
|
|
13780
|
+
useCallback as useCallback41,
|
|
13632
13781
|
useMemo as useMemo30,
|
|
13633
|
-
useRef as
|
|
13782
|
+
useRef as useRef33,
|
|
13634
13783
|
useState as useState24
|
|
13635
13784
|
} from "react";
|
|
13636
13785
|
import { Tooltip as Tooltip5, TooltipContent as TooltipContent5, TooltipTrigger as TooltipTrigger5 } from "@tutti-os/ui-system";
|
|
@@ -14577,6 +14726,9 @@ var agent_vinyl_player_chassis_default = "data:image/png;base64,iVBORw0KGgoAAAAN
|
|
|
14577
14726
|
// app/renderer/assets/icons/agent-vinyl-tonearm.png
|
|
14578
14727
|
var agent_vinyl_tonearm_default = "data:image/png;base64,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";
|
|
14579
14728
|
|
|
14729
|
+
// app/renderer/assets/icons/agent-vinyl-beta-tag.svg
|
|
14730
|
+
var agent_vinyl_beta_tag_default = 'data:image/svg+xml,<svg width="113" height="47" viewBox="0 0 113 47" fill="none" xmlns="http://www.w3.org/2000/svg">%0A<path d="M98.7754 41.7588C98.7385 41.7575 98.7016 41.7585 98.665 41.7568C98.6099 41.7543 98.5554 41.7485 98.501 41.7451C98.5914 41.7506 98.6829 41.7554 98.7754 41.7588ZM103.861 39.9443C103.763 40.0203 103.665 40.0938 103.567 40.165C103.473 40.2338 103.378 40.299 103.283 40.3633C103.475 40.2324 103.669 40.0935 103.861 39.9443ZM40.6143 37.6377L40.9277 38.0684C40.8192 37.927 40.7151 37.7837 40.6143 37.6377L40.3232 37.1934C40.4162 37.3439 40.5135 37.4918 40.6143 37.6377ZM48.6426 36.9961C48.6186 36.9853 48.5941 36.976 48.5703 36.9648L48.5332 36.9453C48.5695 36.9626 48.6059 36.9796 48.6426 36.9961ZM55.4688 36.5215L55.4121 36.5449C55.4896 36.5101 55.5673 36.4752 55.6445 36.4385C55.5859 36.4664 55.5275 36.4947 55.4688 36.5215ZM25.4287 31.3164C25.4255 31.3031 25.4219 31.291 25.4121 31.2725C25.3956 31.2413 25.3015 31.0794 24.9619 30.8184L24.9463 30.8066L24.917 30.7832C24.8157 30.7042 24.686 30.6205 24.5234 30.5361L24.2354 32.4893C24.5906 32.475 24.8166 32.4236 24.9512 32.376C25.0789 32.3308 25.1677 32.2759 25.2471 32.209C25.3131 32.1426 25.3396 32.0976 25.3584 32.0508C25.3837 31.9879 25.4404 31.8123 25.4404 31.4482C25.4404 31.3714 25.4323 31.3313 25.4287 31.3164ZM52.4131 23.6328L52.0547 24.0615L52.0439 24.0752L51.9785 24.1797L52.043 24.1494L52.4131 23.6328ZM91.4775 23.1846C92.4222 23.1847 93.0076 24.1177 92.9033 25.0566L92.0869 32.4062C92.0512 32.728 91.9792 33.0456 91.8555 33.3447C90.9206 35.604 89.7418 36.4002 88.4531 36.4004C87.7146 36.4004 87.1065 36.1693 86.5859 35.6797L88.1504 34.0098C88.1523 34.0049 88.1544 34 88.1562 33.9951L86.5625 35.6572C86.4722 35.5705 86.384 35.4766 86.2988 35.374C86.2781 35.3476 86.2584 35.3202 86.2383 35.293L88.3525 33.1797L88.3721 33.1992C88.3974 33.0431 88.4133 32.8841 88.4199 32.7227L85.4531 32.9922C85.4321 32.7626 85.4209 32.5203 85.4209 32.2646C85.4209 32.0501 85.4345 31.8145 85.4629 31.5586L85.4668 31.5215C85.6841 28.5416 86.3592 26.4637 87.3711 25.1494C88.3907 23.8347 89.727 23.1846 91.4775 23.1846ZM102.57 35.1699C101.732 36.1573 101.139 36.4002 100.789 36.4004L100.788 35.999L100.789 35.998V36.4004C100.5 36.4004 100.438 36.3212 100.418 36.2959C100.364 36.2286 100.253 36.0133 100.253 35.4805C100.253 34.5922 100.389 33.0811 100.677 30.9082C100.804 29.9523 101.028 28.3396 101.348 26.0684V26.0664C101.668 23.7568 101.973 21.4144 102.262 19.041C102.31 18.6462 102.119 18.2602 101.776 18.0586C100.99 17.5961 99.864 17.4405 98.5811 17.4404C98.0333 17.4404 97.5072 17.4898 97.0059 17.5918L96.5977 17.6689C95.7786 17.8093 94.9385 17.869 94.1191 17.7637L93.7119 17.6973C92.8572 17.5259 91.9675 17.4405 91.0449 17.4404V13.4404C92.2136 13.4405 93.3676 13.5478 94.498 13.7744C94.8428 13.8435 95.3812 13.84 96.208 13.6719C96.9968 13.5114 97.7921 13.4404 98.5811 13.4404L99.1436 13.4482C100.416 13.486 102.021 13.6776 103.473 14.4277L103.805 14.6113L104.117 14.8105C105.635 15.8615 106.457 17.6743 106.232 19.5244C105.978 21.6179 105.709 23.6882 105.43 25.7344C106.679 25.6665 107.97 26.0619 109.021 27.0039L109.022 27.0049C110.488 28.3189 111.665 29.9421 112.334 31.8867C112.677 32.8851 112.695 33.965 112.388 34.9717C111.324 38.4564 109.675 41.7079 106.976 43.8564L106.907 43.9102L106.837 43.9619L106.826 43.9697C104.799 45.5188 102.42 46.6211 99.752 46.7549L99.2051 46.7686C98.1413 46.7685 97.0811 46.671 96.0498 46.4453C94.1296 46.0251 91.9107 45.9701 90.4512 46.3623C89.4471 46.6321 88.4154 46.7774 87.3672 46.8096L86.917 46.8164C83.4797 46.8164 80.3547 45.7321 77.7617 43.5771C77.6671 43.5793 77.5642 43.5832 77.4551 43.5898C77.2683 43.6012 77.0965 43.6179 76.9482 43.6367C76.9363 43.6474 76.9252 43.6594 76.9131 43.6699C74.4682 45.7955 71.5036 46.8164 68.3047 46.8164C65.5232 46.8164 62.4615 46.1052 60.2148 43.7314C59.0999 44.389 57.9142 44.9525 56.667 45.4268C54.2714 46.3504 51.7751 46.8164 49.209 46.8164C45.0826 46.8163 41.2797 45.5641 38.3467 42.6826C38.3357 42.6807 38.3244 42.6776 38.3125 42.6758C38.2125 42.6602 38.0963 42.6491 37.9717 42.6455C37.8472 42.6419 37.7268 42.646 37.6182 42.6562C37.5653 42.6613 37.5189 42.6675 37.4795 42.6738C37.2697 42.844 37.0567 43.012 36.8369 43.1719C33.3828 45.6839 29.2996 46.8164 24.8721 46.8164C22.9197 46.8164 21.0992 46.6903 19.4834 46.3779C18.511 46.1899 17.4809 45.9091 16.4893 45.4697C14.8222 46.2913 12.9924 46.7197 11.0479 46.7197C8.24213 46.7197 5.2674 45.9852 3.00098 43.7188C0.936589 41.6542 1.43051e-05 39.0211 0 36.248C0 31.5465 2.52314 27.9472 6.09375 25.2373C5.46495 24.8649 4.86417 24.4311 4.30176 23.9268L3.95703 23.6035C1.76692 21.4668 0.480469 18.7192 0.480469 15.5596C0.480651 10.7619 2.72153 6.82466 6.53516 4.00684L6.55273 3.99316L6.82812 3.79199L6.86719 3.76465C10.5986 1.10731 15.1724 5.24521e-06 20.168 0C22.8036 0 25.2975 0.269182 27.6113 0.857422L27.6299 0.860352L28.4375 1.06738C30.3085 1.57664 32.0755 2.27148 33.5879 3.25C34.9018 4.1002 36.0852 5.1057 37.1016 6.27832L37.1289 6.30957L37.1553 6.3418L37.4678 6.71777L37.5312 6.79492L37.5918 6.87402L37.5977 6.88184C39.4723 9.35319 40.4293 12.2242 40.3838 15.3311L40.3828 15.3535V15.375L40.3721 15.793L40.3682 15.8916C40.3432 16.3874 40.2851 16.8727 40.2021 17.3477C43.3558 14.7777 47.1023 13.4404 51.2734 13.4404C53.3206 13.4404 55.3336 13.7342 57.2041 14.4346C57.9674 13.8652 58.8895 13.515 59.8721 13.4521L60.8906 4.7998V4.79785C61.109 2.95194 62.335 1.37474 64.0771 0.710938L64.3535 0.611328C65.7402 0.134266 67.2075 0 68.5449 0C70.3559 3.3617e-05 72.6491 0.370695 74.5312 1.98047C76.566 3.72107 77.1924 6.09412 77.1924 8.12012C77.1923 8.47243 77.1471 8.85523 77.1445 8.87891C77.1276 9.03628 77.1028 9.24013 77.0762 9.46387C77.0204 9.93235 76.9388 10.601 76.8301 11.4668C76.7579 12.0418 76.6722 12.7058 76.5762 13.458C78.4968 13.5884 80.1993 14.51 81.3613 15.9004C84.1412 14.2475 87.3165 13.4405 90.7568 13.4404V17.4404C86.7364 17.4405 83.3527 18.7798 80.6855 21.4814C79.9338 22.243 79.2904 23.0748 78.7539 23.9746C78.2696 24.7871 74.1389 25.4678 73.29 24.8477L73.2188 24.7842C72.7233 24.2302 72.9395 23.136 73.6826 23.1357H76.9072C78.0371 23.1357 78.953 22.2197 78.9531 21.0898V20.2881C78.9531 18.7154 77.6782 17.4404 76.1055 17.4404H75.7158L75.5332 17.4355C73.67 17.3329 72.2627 15.6641 72.5029 13.7881C72.6444 12.6839 72.764 11.744 72.8613 10.9688C72.9694 10.1082 73.0501 9.4485 73.1045 8.99121C73.1316 8.76295 73.1529 8.58223 73.167 8.45117C73.1773 8.35508 73.1924 8.21197 73.1924 8.12012C73.1924 6.88166 72.8232 5.78397 71.9307 5.02051C71.068 4.28267 69.8801 4.00002 68.5449 4C67.3637 4 66.3319 4.13275 65.501 4.44922C65.1528 4.58188 64.9071 4.89757 64.8633 5.26758L63.6914 15.2285L63.6523 15.4609C63.408 16.6048 62.3939 17.4404 61.2031 17.4404H60.1924C59.7866 17.4405 59.4211 17.6859 59.2676 18.0615C59.1451 18.3609 59.045 18.6641 58.9668 18.9707L58.9414 19.0459C58.8032 19.3842 58.3593 19.5492 58.0361 19.3799L57.9688 19.3389L57.8398 19.248L57.5049 19.0244C55.8114 17.945 53.712 17.4404 51.2734 17.4404C47.5501 17.4404 44.3226 18.7791 41.6426 21.4248L41.6387 21.4297C40.7849 22.2835 40.0663 23.1887 39.4844 24.1436L39.4131 24.249C38.6243 25.3181 36.215 25.6225 35.1895 24.8086C34.9112 24.5845 34.6263 24.3732 34.335 24.1748L34.042 23.9805C33.1663 23.4179 33.0511 21.9469 33.7871 21.2109L34.0967 20.8887C35.4962 19.3693 36.2753 17.6293 36.373 15.6904L36.3838 15.2725C36.4161 13.0675 35.7507 11.0627 34.4043 9.29102L34.3975 9.28223L34.3916 9.27441L34.0791 8.89844C33.33 8.03412 32.4396 7.27137 31.415 6.6084C30.1991 5.82167 28.6096 5.21113 26.6914 4.74805L26.6885 4.74609V4.74902L25.9473 4.57227C24.1924 4.18865 22.2642 4 20.168 4C15.7463 4 12.0579 4.97829 9.1875 7.02246L8.91211 7.22363C6.00194 9.37388 4.4806 12.1699 4.48047 15.5596C4.48047 17.5483 5.26237 19.2889 6.75 20.7402C7.89514 21.8573 9.37063 22.5531 11.1191 22.8789C12.129 23.0671 12.8941 24.0546 12.7695 25.0742L12.7285 25.2891C12.6037 25.7704 12.2702 26.1215 11.8066 26.3633C6.82652 28.961 4 32.2178 4 36.248C4.00001 38.0827 4.59714 39.6586 5.8291 40.8906C7.10133 42.1629 8.8991 42.7197 11.0479 42.7197C11.6708 42.7197 12.2721 42.6558 12.8516 42.5322C12.9946 42.8159 13.1715 43.0782 13.377 43.3164C13.1783 43.072 13.0108 42.8071 12.876 42.5273C14.0638 42.2703 15.1588 41.7569 16.1523 40.9912L16.4463 40.7549C16.4575 40.7455 16.4724 40.7513 16.4766 40.7627V40.7881C16.4778 40.7918 16.4801 40.7955 16.4834 40.7979L17.085 41.2334C17.8901 41.8171 18.9693 42.2041 20.2422 42.4502C21.5254 42.6983 23.0736 42.8164 24.8721 42.8164C28.5991 42.8164 31.8223 41.8726 34.4844 39.9365C34.7309 39.7573 34.9662 39.5713 35.1904 39.3789C36.4056 38.3364 39.8003 38.4063 40.8965 39.5732L40.9004 39.5771C42.9803 41.7645 45.7911 42.8163 49.209 42.8164C51.2825 42.8164 53.2914 42.4423 55.2285 41.6953C57.1741 40.9573 58.8738 39.9926 60.3135 38.793L60.3242 38.7832C60.8342 38.346 61.6617 38.6012 61.9414 39.2119C62.2061 39.79 62.5541 40.3319 62.9854 40.835L62.9902 40.8398L62.9951 40.8457C64.2156 42.2288 66.0655 42.8164 68.3047 42.8164C70.6082 42.8164 72.6215 42.0993 74.2881 40.6504L74.2891 40.6494C74.4715 40.4936 74.6428 40.3279 74.8047 40.1543C75.0265 39.9164 75.804 39.7348 76.6758 39.6426C76.6931 40.2543 76.8517 40.8683 77.1719 41.4355L78.2812 40.4316C78.2745 40.3056 78.2628 40.1798 78.2441 40.0547C78.2627 40.1796 78.2755 40.305 78.2822 40.4307L79.1191 39.6738C79.3597 39.7235 79.5414 39.7914 79.6338 39.8838L79.6406 39.8896C81.6261 41.8394 84.0725 42.8164 86.917 42.8164C87.6852 42.8164 88.4187 42.735 89.1162 42.5732L89.4131 42.499C91.6916 41.8868 94.5995 42.0338 96.9043 42.5381C97.6133 42.6932 98.3828 42.7685 99.2051 42.7686C101.02 42.7684 102.782 42.0462 104.474 40.7344L104.484 40.7266C105.574 39.8591 106.49 38.645 107.257 37.125C107.324 37.1284 107.392 37.1328 107.46 37.1328C108.169 37.1328 108.821 36.9531 109.384 36.6436L107.784 35.9756C107.854 35.8089 107.923 35.6394 107.989 35.4668L109.981 36.2393C109.999 36.2249 110.016 36.2099 110.033 36.1953L108.008 35.416C108.204 34.904 108.39 34.367 108.562 33.8047C108.623 33.6031 108.619 33.3868 108.551 33.1875C108.136 31.9795 107.388 30.9117 106.353 29.9834C105.804 29.4923 104.932 29.7417 104.726 30.4482C104.071 32.692 103.337 34.2342 102.57 35.1699ZM70.6162 35.5566L69.9336 35.0908C69.9346 35.0678 69.9361 35.0438 69.9375 35.0186L70.3203 35.3027V33.0098L70.3213 33.0078L70.3203 35.3027L70.6309 35.5332L70.6182 35.5586L70.6162 35.5566L70.5928 35.6016L70.6729 35.5947L70.6182 35.5586L70.6309 35.5332L70.71 35.5928L71.3936 35.54C71.3804 35.5747 71.3663 35.6076 71.3525 35.6396L71.2178 35.6562L70.9922 35.8018L71.1865 35.9463L70.9834 35.8076L70.835 35.7061L69.96 35.8184C69.9544 35.7746 69.9486 35.7282 69.9443 35.6787L70.3203 35.6465V35.6221L70.5928 35.6016L70.6162 35.5566ZM11.4072 34.6094L10.4658 35.498L10.6621 35.6943L10.9424 35.666C10.9307 35.6834 10.919 35.7003 10.9072 35.7168L10.7168 35.749L10.8096 35.8418L10.7021 35.751L10.0879 35.8545L10.0352 35.9043L10.1836 35.8926V35.9053L10.0205 35.918L9.57812 35.9521C9.57064 35.9102 9.56402 35.8627 9.55957 35.8086L10.2051 35.7422L10.4336 35.5254L10.1836 35.3145V35.2158L10.4639 35.4961L11.4092 34.6006C11.4083 34.6035 11.4081 34.6065 11.4072 34.6094ZM8.59082 36.1045C8.58667 36.0797 8.5806 36.0549 8.57715 36.0293L8.57617 36.0166C8.58005 36.0465 8.58599 36.0756 8.59082 36.1045ZM68.9678 35.9463C68.9614 35.8967 68.955 35.846 68.9502 35.7939L68.9482 35.7646C68.9536 35.8269 68.9602 35.8875 68.9678 35.9463ZM9.58105 35.9385L10.0352 35.9043L10.0859 35.8545L9.58105 35.9385ZM10.8076 35.8477C10.8045 35.8514 10.8009 35.8547 10.7979 35.8584L10.1836 35.9053V35.8926L10.8096 35.8447L10.8076 35.8477ZM86.7471 35.8105C87.3282 35.3951 87.7925 34.829 88.084 34.1699L86.7471 35.8105ZM70.8594 35.7031L70.9922 35.8018L71.2168 35.6572L70.8594 35.7031ZM70.3203 35.6465L69.9443 35.6787C69.9435 35.6694 69.9431 35.6599 69.9424 35.6504L70.3203 35.6221V35.6465ZM10.4346 35.5264L10.207 35.7422L10.6377 35.6973L10.4346 35.5264ZM10.1836 35.2158V35.3145L9.70801 34.915C9.7247 34.8754 9.74195 34.8348 9.76172 34.7939L10.1836 35.2158ZM86.2383 35.293C86.2103 35.255 86.1829 35.2164 86.1562 35.1768L88.3525 33.1797L86.2383 35.293ZM107.566 33.6406C107.521 33.7866 107.475 33.9305 107.428 34.0723C107.315 34.4123 107.196 34.7391 107.074 35.0547C107.249 34.5987 107.415 34.1176 107.572 33.6113C107.57 33.621 107.569 33.6311 107.566 33.6406ZM92.3848 34.5801L92.1514 34.9971C92.3102 34.7303 92.4611 34.4411 92.6045 34.1299C92.5329 34.2853 92.4603 34.4357 92.3848 34.5801ZM19.1064 32.9424C19.0364 33.3466 18.9585 33.7359 18.874 34.1104C18.9154 33.927 18.9553 33.7402 18.9932 33.5498L19.1064 32.9424ZM59.5713 33.6562L59.1914 34.0098C59.3197 33.8937 59.4462 33.7763 59.5713 33.6562L59.9414 33.29C59.8196 33.4141 59.6963 33.5362 59.5713 33.6562ZM11.5693 33.9365L10.5186 33.7568C10.5252 33.7499 10.5313 33.7423 10.5381 33.7354L11.5693 33.9365ZM10.9092 33.3818L11.6426 33.5078L10.8906 33.3984C10.8968 33.3929 10.903 33.3874 10.9092 33.3818ZM107.561 33.3867C107.563 33.3927 107.564 33.3992 107.565 33.4053C107.532 33.3141 107.497 33.2235 107.459 33.1338L107.46 33.1328C107.495 33.2164 107.529 33.3015 107.561 33.3867ZM60.6523 32.5225L60.3018 32.9121C60.4204 32.784 60.537 32.6546 60.6523 32.5225L60.9932 32.1201C60.8811 32.2562 60.7676 32.3904 60.6523 32.5225ZM30.4121 32.1152C30.4105 32.1336 30.407 32.1517 30.4053 32.1699C30.4076 32.1452 30.411 32.1206 30.4131 32.0957L30.4121 32.1152ZM12.5186 30.9971L11.8867 31.3926C12.0877 31.2609 12.2988 31.1287 12.5186 30.9971ZM100.825 22.4482C100.673 23.6162 100.517 24.7768 100.357 25.9287C100.197 27.0642 100.061 28.0359 99.9492 28.8438L99.6855 30.7764L99.6846 30.7754C99.8126 29.8153 100.037 28.199 100.356 25.9277C100.516 24.7759 100.673 23.6161 100.825 22.4482L101.27 18.9209C101.126 20.1047 100.977 21.2804 100.825 22.4482ZM49.9287 30.1455C50.1285 30.0576 50.32 29.9632 50.5039 29.8633L50.5049 29.8643L50.2236 30.0098C50.1277 30.0566 50.0286 30.1016 49.9287 30.1455C49.6287 30.2775 49.3116 30.3959 48.9756 30.501L49.3047 30.3916C49.5207 30.3156 49.7287 30.2335 49.9287 30.1455ZM10.8428 28.0498C10.4492 28.2875 10.0755 28.5289 9.72168 28.7744C9.7588 28.7487 9.79545 28.722 9.83301 28.6963C10.1015 28.5128 10.3811 28.3314 10.6719 28.1523C10.7282 28.1177 10.7856 28.0843 10.8428 28.0498ZM10.9551 27.9814C11.0085 27.9496 11.0621 27.9175 11.1162 27.8857L11.5781 27.6221C11.3653 27.7408 11.1576 27.8606 10.9551 27.9814ZM51.7295 24.4521L51.2988 24.9678H51.3164L51.2998 24.9688L50.5557 25.8594C50.5925 25.8599 50.6293 25.8598 50.666 25.8613L51.2764 25.0703L51.3506 24.9688L51.7295 24.4521ZM59.625 24.3926L59.6143 24.8486C59.6069 24.9912 59.5954 25.1321 59.5811 25.2715C59.6105 24.9852 59.625 24.6926 59.625 24.3926ZM49.8828 25.0635C49.8953 25.0949 49.9049 25.1236 49.916 25.1475L50.2969 24.9688H50.1172L49.8828 25.0635ZM49.8477 24.9746C49.8583 25.0064 49.8713 25.0348 49.8818 25.0615L50.1143 24.9688H49.8652L49.8477 24.9746ZM49.8477 24.9746L49.8652 24.9688H49.8457C49.8464 24.9707 49.847 24.9727 49.8477 24.9746ZM51.3008 24.4893L50.1182 24.9678H50.2979L51.3613 24.4697L51.3008 24.4893ZM51.2891 24.4932L49.8672 24.9678H50.1152L51.2891 24.4932ZM52.0518 24.0654L51.9414 24.1973L51.9375 24.2021L51.9502 24.1963L51.9541 24.1914L51.9766 24.1807L52.04 24.0801L52.0479 24.0703L52.042 24.0771L52.0439 24.0752L52.0488 24.0684L52.0479 24.0703L52.0518 24.0654ZM52.04 24.0801L51.9541 24.1914L51.9414 24.1973L52.042 24.0771L52.04 24.0801ZM52.0479 24.0703L52.0439 24.0752L52.0547 24.0615L52.0479 24.0703ZM53.5938 23.5762L53.6426 23.709C53.626 23.6593 53.6078 23.6113 53.5889 23.5645L53.5938 23.5762ZM53.0293 22.7988C53.0452 22.8111 53.0598 22.825 53.0752 22.8379C53.0555 22.8214 53.0361 22.8045 53.0156 22.7891L53.0293 22.7988ZM18.8242 10.3682C21.8599 10.3682 24.1234 10.9962 25.7197 12.1406C27.1965 13.2276 27.8112 14.4703 27.7607 15.9092V15.918L27.7598 15.9268C27.7326 17.4699 27.1738 18.5249 26.1318 19.2461C24.2321 20.5434 22.2784 18.3539 22.6143 16.0781L23.2217 11.9619C23.2981 11.4415 22.9584 10.9505 22.4443 10.8389C21.6344 10.6628 20.7947 10.5762 19.9277 10.5762C18.0322 10.5762 16.3217 11.0348 14.832 11.9795C14.5853 12.1363 14.4194 12.3933 14.3779 12.6826C14.3134 13.1343 14.1851 14.0655 13.9932 15.4727L13.9912 15.4844L13.9902 15.4951C13.9232 16.0854 13.8409 16.7562 13.7451 17.5078L13.7305 17.5332C13.7227 17.5395 13.7128 17.5431 13.7021 17.542C12.6956 17.4301 11.9682 17.1334 11.4502 16.7129C10.9556 16.2813 10.7521 15.8171 10.752 15.2725C10.752 13.9492 11.4425 12.8173 13.1982 11.8828L13.209 11.877C15.0589 10.8625 16.9268 10.3682 18.8242 10.3682ZM91.0449 13.4404V17.4404H90.7568V13.4404H91.0449ZM9.78223 15.6904C9.77749 15.6571 9.77213 15.6236 9.76855 15.5898L9.75586 15.4326C9.7604 15.52 9.77022 15.6058 9.78223 15.6904ZM13.7422 15.1289L12.7627 15.2676L12.7822 15.2705L13.7451 15.1689L13.7422 15.1289ZM19.9805 9.39844C20.0716 9.40342 20.162 9.4108 20.252 9.41699C20.1505 9.41 20.0483 9.40291 19.9453 9.39746L19.9805 9.39844ZM26.6914 4.74805L26.6885 4.74902V4.74609L26.6914 4.74805ZM29.4404 31.4482C29.4404 33.0316 28.9368 34.2266 27.9795 35.1338C27.0125 36.0189 25.7352 36.4961 24.0557 36.4961C22.334 36.496 20.8657 36.1554 19.623 35.5059C19.585 35.486 19.5664 35.4417 19.5781 35.4004C19.7696 34.7239 19.9329 34.0028 20.0693 33.2393L20.1973 32.4609V32.457L21.1172 26.2256C21.1391 26.0775 21.2663 25.9678 21.416 25.9678C24.059 25.9678 26.0079 26.561 27.377 27.6289L27.3848 27.6348C28.8048 28.7208 29.4404 29.9782 29.4404 31.4482ZM52.0742 24.1348L52.6299 23.874C52.7333 24.0885 52.8174 24.4268 52.8174 24.9688C52.8172 25.7402 52.4657 26.6564 51.5625 27.7344L51.5576 27.7402L51.5527 27.7471C50.7791 28.701 49.5413 29.4135 47.708 29.7979C47.1579 29.9133 46.8104 30.46 46.9404 31.0068L47.6123 33.8389C47.7345 34.3545 48.238 34.6854 48.7598 34.5928C52.2805 33.9676 55.1379 32.8497 57.2598 31.1826L57.2617 31.1836C59.4845 29.4624 60.6248 27.172 60.625 24.3926V24.375L60.624 24.3164C60.6085 23.7017 61.0667 23.136 61.6816 23.1357C62.2643 23.1357 62.7169 23.6439 62.6494 24.2227L62.2236 27.876C62.1629 28.3963 62.0048 28.9022 61.7324 29.3496C60.542 31.3042 59.0946 32.9187 57.3916 34.2021C55.3297 35.756 53.2317 36.4961 51.0811 36.4961C49.7125 36.496 48.5981 36.0397 47.6748 35.123C46.8314 34.2258 46.3214 32.7909 46.3213 30.6328C46.3213 28.4642 46.8384 26.6667 47.8281 25.1943L47.8291 25.1934C48.4315 24.3067 49.0404 23.7419 49.6514 23.4229C49.6458 23.5166 49.6426 23.612 49.6426 23.709C49.6426 24.1374 49.7113 24.5634 49.8457 24.9688L49.8672 24.9678L51.3613 24.4697L51.9033 24.2148L52.2754 23.709L52.2803 23.7021L52.3809 23.5645C52.4015 23.5782 52.4232 23.5945 52.4453 23.6143L52.0742 24.1348Z" fill="white"/>%0A<path d="M28.4639 3.52802L38.4639 19.528L43.9639 18.528L58.9639 16.528L60.9639 13.028L70.9639 2.52802L74.9639 13.028L77.4639 16.528H84.4639L101.464 15.528L103.464 19.528L104.464 28.528L110.964 34.528L107.464 40.028L95.4639 44.528L79.9639 42.528L69.4639 43.528L60.9639 40.028L48.9639 41.528L35.9639 40.028L28.4639 43.528L3.96387 40.028L6.46387 24.028V8.02802L28.4639 3.52802Z" fill="white"/>%0A<path d="M68.5449 4C69.8801 4.00002 71.068 4.28267 71.9307 5.02051C72.8232 5.78397 73.1924 6.88166 73.1924 8.12012C73.1924 8.21197 73.1773 8.35508 73.167 8.45117C73.1529 8.58223 73.1316 8.76295 73.1045 8.99121C73.0501 9.4485 72.9694 10.1082 72.8613 10.9688C72.6701 12.4915 72.3932 14.6487 72.0332 17.4404H78.9531V23.1357H71.5674C74.42 25.6981 76.1743 28.5122 76.7109 31.5742C76.8326 27.4637 78.1333 24.0668 80.6855 21.4814C83.3527 18.7798 86.7364 17.4405 90.7568 17.4404H91.0449C92.5836 17.4405 94.0307 17.6768 95.377 18.1562C96.3253 17.6699 97.4028 17.4404 98.5811 17.4404C99.864 17.4405 100.99 17.5961 101.776 18.0586L102.341 18.3906L102.262 19.041C101.973 21.4144 101.668 23.7568 101.348 26.0664V26.0684C101.028 28.3396 100.804 29.9523 100.677 30.9082C100.389 33.0811 100.253 34.5922 100.253 35.4805C100.253 36.0133 100.364 36.2286 100.418 36.2959C100.438 36.3212 100.5 36.4004 100.789 36.4004C101.139 36.4002 101.732 36.1573 102.57 35.1699C103.337 34.2342 104.071 32.692 104.726 30.4482L105.17 28.9238L106.353 29.9834C107.388 30.9117 108.136 31.9795 108.551 33.1875L108.656 33.4941L108.562 33.8047C107.606 36.9332 106.278 39.2985 104.484 40.7266L104.474 40.7344C102.782 42.0462 101.02 42.7684 99.2051 42.7686C96.5868 42.7685 94.507 42.002 93.1943 40.3418C91.4862 41.9793 89.3804 42.8163 86.917 42.8164C84.0725 42.8164 81.6261 41.8394 79.6406 39.8896L79.6338 39.8838C78.1318 38.3818 77.2209 36.5257 76.8691 34.3613C76.7467 37.0673 75.9475 39.2323 74.2881 40.6494L74.2891 40.6504C72.6224 42.0997 70.6085 42.8164 68.3047 42.8164C66.0655 42.8164 64.2156 42.2288 62.9951 40.8457L62.9902 40.8398L62.9854 40.835C62.2087 39.9289 61.7033 38.8962 61.4648 37.7549C61.1003 38.0992 60.7211 38.443 60.3242 38.7832L60.3135 38.793C58.8738 39.9926 57.1741 40.9573 55.2285 41.6953C53.2914 42.4423 51.2825 42.8164 49.209 42.8164C45.7911 42.8163 42.9803 41.7645 40.9004 39.5771L40.8965 39.5732C39.5956 38.1884 38.6956 36.5758 38.1777 34.7559C37.5846 36.8372 36.3539 38.5768 34.4844 39.9365C31.8223 41.8726 28.5991 42.8164 24.8721 42.8164C23.0736 42.8164 21.5254 42.6983 20.2422 42.4502C18.9693 42.2041 17.8901 41.8171 17.085 41.2334L16.4717 40.7891L16.501 40.708C14.9375 42.0385 13.1092 42.7197 11.0479 42.7197C8.8991 42.7197 7.10133 42.1629 5.8291 40.8906C4.59714 39.6586 4.00001 38.0827 4 36.248C4 31.9918 7.15267 28.5983 12.665 25.9326C12.7625 25.1241 12.8794 24.1752 13.0156 23.0859C10.4233 22.9821 8.28857 22.241 6.75 20.7402C5.26237 19.2889 4.48047 17.5483 4.48047 15.5596C4.4806 12.1699 6.00194 9.37388 8.91211 7.22363L9.1875 7.02246C12.0579 4.97829 15.7463 4 20.168 4C22.564 4 24.7404 4.24675 26.6895 4.74902L26.6904 4.74805C28.609 5.21115 30.1989 5.82155 31.415 6.6084C32.4396 7.27137 33.33 8.03412 34.0791 8.89844L34.3916 9.27441L34.3975 9.28223L34.4043 9.29102C35.7507 11.0627 36.4161 13.0675 36.3838 15.2725L36.373 15.6904C36.2753 17.6293 35.4962 19.3693 34.0967 20.8887L33.7871 21.2109C33.1443 21.8538 32.4475 22.382 31.7002 22.7959C32.9574 23.2781 34.1219 23.9487 35.1895 24.8086C36.4235 25.788 37.3287 26.9265 37.8945 28.2119C38.3933 25.685 39.6501 23.4183 41.6387 21.4297L41.6426 21.4248C44.3226 18.7791 47.5501 17.4404 51.2734 17.4404C53.8749 17.4404 56.0905 18.0142 57.8389 19.248H57.8398C58.1875 19.4871 58.5032 19.7453 58.7871 20.0215C58.8462 19.3531 59.0069 18.6988 59.2676 18.0615L59.5215 17.4404H63.4307L64.8633 5.26758L64.9346 4.66504L65.501 4.44922C66.3319 4.13275 67.3637 4 68.5449 4ZM99.2051 41.7676C99.1332 41.7676 99.0619 41.7649 98.9912 41.7637C99.062 41.7648 99.1332 41.7686 99.2051 41.7686C99.2988 41.7685 99.3925 41.7653 99.4863 41.7607C99.3925 41.7653 99.2988 41.7676 99.2051 41.7676ZM98.665 41.7568C98.7016 41.7585 98.7385 41.7575 98.7754 41.7588C98.6829 41.7554 98.5914 41.7506 98.501 41.7451C98.5554 41.7485 98.6099 41.7543 98.665 41.7568ZM98.0947 41.7129C98.1682 41.7205 98.2424 41.7264 98.3174 41.7324C98.2424 41.7265 98.1682 41.7203 98.0947 41.7129ZM103.86 39.9443C103.668 40.0935 103.475 40.2324 103.283 40.3633C103.378 40.299 103.473 40.2338 103.567 40.165C103.665 40.0938 103.763 40.0203 103.861 39.9443C103.953 39.8714 104.042 39.7939 104.132 39.7148C104.042 39.794 103.952 39.8713 103.86 39.9443ZM80.3408 39.1768C80.4526 39.2865 80.5658 39.3932 80.6807 39.4961H80.6816C80.5664 39.3929 80.4529 39.2859 80.3408 39.1758C80.2343 39.0692 80.1304 38.9612 80.0303 38.8506C80.1304 38.9612 80.2343 39.0702 80.3408 39.1768ZM41.625 38.8887C41.7409 39.0106 41.8593 39.1289 41.9805 39.2432L41.9814 39.2422C41.8602 39.1278 41.741 39.0097 41.625 38.8877V38.8887ZM40.6133 37.6377C40.7141 37.7837 40.8192 37.927 40.9277 38.0684L40.6143 37.6377C40.5135 37.4918 40.4162 37.3439 40.3232 37.1934L40.6133 37.6377ZM48.5703 36.9648C48.5941 36.976 48.6186 36.9853 48.6426 36.9961C48.6059 36.9796 48.5695 36.9626 48.5332 36.9453L48.5703 36.9648ZM85.9043 36.4111C85.9719 36.4744 86.0401 36.5355 86.1104 36.5928C86.0401 36.5355 85.9718 36.4745 85.9043 36.4111ZM55.4121 36.5449L55.4688 36.5215C55.5275 36.4947 55.5859 36.4664 55.6445 36.4385C55.5673 36.4752 55.4896 36.5101 55.4121 36.5449ZM20.1973 32.458V32.46C20.0352 33.544 19.8225 34.5497 19.5576 35.4717L19.623 35.5059C20.8657 36.1554 22.334 36.496 24.0557 36.4961C25.7352 36.4961 27.0125 36.0189 27.9795 35.1338C28.9368 34.2266 29.4404 33.0316 29.4404 31.4482C29.4404 29.9782 28.8048 28.7208 27.3848 27.6348L27.377 27.6289C26.0079 26.561 24.059 25.9678 21.416 25.9678H21.1553L20.1973 32.458ZM50.9854 23.0889C49.9257 23.0889 48.8689 23.6635 47.8291 25.1943L47.8281 25.1934C46.8381 26.6659 46.3213 28.4638 46.3213 30.6328C46.3214 32.7909 46.8314 34.2258 47.6748 35.123C48.5981 36.0397 49.7125 36.496 51.0811 36.4961C53.2317 36.4961 55.3297 35.756 57.3916 34.2021C59.29 32.7715 60.8707 30.9301 62.1318 28.6641L62.7764 23.1357H60.4922C60.572 23.5318 60.6175 23.9449 60.625 24.375V24.3926C60.6248 27.1723 59.485 29.4624 57.2617 31.1836L57.2607 31.1826C55.1388 32.8499 52.2808 33.9675 48.7598 34.5928L47.8301 34.7578L47.6123 33.8389L46.9404 31.0068L46.7031 30.0088L47.708 29.7979C49.5413 29.4135 50.7791 28.701 51.5527 27.7471L51.5576 27.7402L51.5625 27.7344C52.4657 26.6564 52.8172 25.7402 52.8174 24.9688C52.8174 23.9909 52.5521 23.6721 52.3711 23.5576L52.3447 23.541L52.3203 23.5234C51.913 23.2293 51.4771 23.0889 50.9854 23.0889ZM70.4922 29.6309C70.1122 32.8902 69.9287 34.7529 69.9287 35.2881C69.9287 35.9325 70.0383 36.2437 70.1172 36.3662C70.1472 36.4128 70.1659 36.4222 70.1709 36.4248C70.1789 36.429 70.2191 36.4482 70.3203 36.4482C70.6301 36.4482 70.9048 36.3317 71.1895 35.9482C71.4576 35.5555 71.6729 34.8156 71.6729 33.5596C71.6728 32.2761 71.2961 30.9685 70.4922 29.6309ZM55.7041 36.4102C55.7988 36.3644 55.8929 36.3162 55.9873 36.2676C55.8929 36.3162 55.7988 36.3644 55.7041 36.4102ZM91.4775 23.1846C89.727 23.1846 88.3907 23.8347 87.3711 25.1494C86.3592 26.4637 85.6841 28.5416 85.4668 31.5215L85.4629 31.5586C85.4345 31.8145 85.4209 32.0501 85.4209 32.2646C85.421 33.6713 85.7488 34.6734 86.2988 35.374C86.88 36.0743 87.5747 36.4004 88.4531 36.4004C89.8247 36.4002 91.0723 35.4985 92.0332 32.8906L93.083 23.4355C92.5194 23.2661 91.985 23.1847 91.4775 23.1846ZM85.5244 36.0078C85.6347 36.141 85.7502 36.2639 85.8691 36.3779C85.8022 36.3137 85.7361 36.2471 85.6719 36.1768C85.6223 36.1225 85.5733 36.0667 85.5254 36.0088L85.5244 36.0078ZM11.7607 32.6914C11.2054 33.0968 10.7607 33.4878 10.4189 33.8623C9.76859 34.5749 9.55176 35.1571 9.55176 35.624C9.55176 36.0597 9.65641 36.2005 9.6875 36.2334C9.70897 36.256 9.81054 36.3515 10.1836 36.3516C10.1839 36.3516 10.3933 36.3449 10.8076 35.8477L10.8115 35.8438C11.1088 35.4905 11.3844 34.886 11.5693 33.9365L11.6426 33.5078L11.7607 32.6914ZM8.57715 36.0293C8.5806 36.0549 8.58667 36.0797 8.59082 36.1045C8.58599 36.0756 8.58005 36.0465 8.57617 36.0166L8.57715 36.0293ZM56.8828 35.7598C56.7059 35.8693 56.5287 35.974 56.3506 36.0732C56.5287 35.974 56.7059 35.8694 56.8828 35.7598ZM68.9502 35.7939C68.955 35.846 68.9614 35.8967 68.9678 35.9463C68.9602 35.8875 68.9536 35.8269 68.9482 35.7646L68.9502 35.7939ZM106.861 35.5908C106.927 35.4331 106.991 35.2717 107.055 35.1074C106.991 35.2717 106.927 35.4331 106.861 35.5908ZM107.604 33.5117C107.439 34.0549 107.261 34.5688 107.074 35.0547C107.196 34.7391 107.315 34.4123 107.428 34.0723C107.488 33.8893 107.547 33.7027 107.605 33.5127C107.562 33.3849 107.513 33.2576 107.46 33.1328H107.459C107.512 33.2576 107.561 33.3839 107.604 33.5117ZM92.6045 34.1299C92.4611 34.4411 92.3102 34.7303 92.1514 34.9971L92.3848 34.5801C92.4603 34.4357 92.5329 34.2853 92.6045 34.1299ZM18.9932 33.5498C18.9553 33.7402 18.9154 33.927 18.874 34.1104C18.9585 33.7359 19.0364 33.3466 19.1064 32.9424L18.9932 33.5498ZM59.5713 33.6553C59.4462 33.7753 59.3197 33.8937 59.1914 34.0098L59.5713 33.6562C59.6963 33.5362 59.8196 33.4141 59.9414 33.29L59.5713 33.6553ZM84.4248 32.5547C84.4302 32.7346 84.4414 32.91 84.457 33.0811C84.4416 32.91 84.4312 32.7346 84.4258 32.5547H84.4248ZM60.6523 32.5215C60.537 32.6536 60.4204 32.784 60.3018 32.9121L60.6523 32.5225C60.7676 32.3904 60.8811 32.2562 60.9932 32.1201L60.6523 32.5215ZM30.4053 32.1699C30.407 32.1517 30.4105 32.1336 30.4121 32.1152L30.4131 32.0957C30.411 32.1206 30.4076 32.1452 30.4053 32.1699ZM12.5176 30.9971C12.2978 31.1287 12.0877 31.2609 11.8867 31.3926L12.5186 30.9971C12.6945 30.8916 12.8768 30.7855 13.0645 30.6797C12.8763 30.7858 12.6939 30.8914 12.5176 30.9971ZM45.3467 31.4688C45.3471 31.4753 45.3482 31.4818 45.3486 31.4883C45.3477 31.4733 45.3466 31.4584 45.3457 31.4434L45.3467 31.4688ZM100.824 22.4482C100.672 23.6161 100.516 24.7759 100.356 25.9277C100.036 28.1997 99.8126 29.8164 99.6846 30.7764H99.6855C99.8135 29.8165 100.037 28.2004 100.357 25.9287C100.517 24.7768 100.673 23.6162 100.825 22.4482C100.977 21.2804 101.126 20.1047 101.27 18.9209L100.824 22.4482ZM50.5049 29.8633C50.3208 29.9633 50.1288 30.0575 49.9287 30.1455C49.7287 30.2335 49.5207 30.3156 49.3047 30.3916C49.0887 30.4676 48.8648 30.5376 48.6328 30.6016H48.6338C49.0978 30.4735 49.5297 30.3215 49.9297 30.1455C50.1294 30.0576 50.3212 29.9641 50.5049 29.8643V29.8633ZM10.6719 28.1523C10.3811 28.3314 10.1015 28.5128 9.83301 28.6963C9.79545 28.722 9.7588 28.7487 9.72168 28.7744C10.0755 28.5289 10.4492 28.2875 10.8428 28.0498C10.7856 28.0843 10.7282 28.1177 10.6719 28.1523ZM11.1162 27.8857C11.0621 27.9175 11.0085 27.9496 10.9551 27.9814C11.1576 27.8606 11.3653 27.7408 11.5781 27.6221L11.1162 27.8857ZM59.625 24.3916C59.625 24.6917 59.6105 24.9852 59.5811 25.2715C59.5954 25.1321 59.6069 24.9912 59.6143 24.8486L59.625 24.3926V24.3916ZM53.5889 23.5645C53.6079 23.6115 53.6259 23.66 53.6426 23.71V23.709C53.6123 23.6182 53.5772 23.5325 53.5391 23.4512C53.5563 23.488 53.5732 23.5257 53.5889 23.5645ZM53.0752 22.8379C53.0598 22.825 53.0452 22.8111 53.0293 22.7988L53.0156 22.7891C53.0361 22.8045 53.0555 22.8214 53.0752 22.8379ZM18.8242 10.3682C16.9268 10.3682 15.0589 10.8625 13.209 11.877L13.1982 11.8828C11.4425 12.8173 10.752 13.9492 10.752 15.2725C10.7521 15.8171 10.9556 16.2813 11.4502 16.7129C11.9682 17.1334 12.6956 17.4301 13.7021 17.542L13.7402 17.5459C13.8381 16.7788 13.922 16.0954 13.9902 15.4951L13.9912 15.4844L13.9932 15.4727C14.1851 14.0655 14.3134 13.1343 14.3779 12.6826L14.4434 12.2266L14.832 11.9795C16.3217 11.0348 18.0322 10.5762 19.9277 10.5762C20.7947 10.5762 21.6344 10.6628 22.4443 10.8389L23.3574 11.0371L23.2217 11.9619L21.9736 20.4141C23.6765 20.395 25.0446 19.9885 26.1318 19.2461C27.1738 18.5249 27.7326 17.4699 27.7598 15.9268L27.7607 15.918V15.9092C27.8112 14.4702 27.1968 13.2286 25.7197 12.1416V12.1406C24.1233 10.996 21.8601 10.3682 18.8242 10.3682ZM9.76855 15.5898C9.77213 15.6236 9.77749 15.6571 9.78223 15.6904C9.77022 15.6058 9.7604 15.52 9.75586 15.4326L9.76855 15.5898ZM20.252 9.41699C20.162 9.4108 20.0716 9.40342 19.9805 9.39844L19.9453 9.39746C20.0483 9.40291 20.1505 9.41 20.252 9.41699Z" fill="%236D7FF5"/>%0A</svg>%0A';
|
|
14731
|
+
|
|
14580
14732
|
// agent-gui/agentGuiNode/AgentGUIVinylPlayer.tsx
|
|
14581
14733
|
import { jsx as jsx16, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
14582
14734
|
function AgentGUIVinylPlayer({
|
|
@@ -14584,7 +14736,16 @@ function AgentGUIVinylPlayer({
|
|
|
14584
14736
|
isPlaying
|
|
14585
14737
|
}) {
|
|
14586
14738
|
const selectedAgentCover = selectedAgent?.iconUrl ?? null;
|
|
14739
|
+
const showBetaBadge = isBetaAgentProvider(selectedAgent?.provider);
|
|
14587
14740
|
return /* @__PURE__ */ jsxs9("div", { className: "agent-gui-vinyl-player", "aria-hidden": "true", children: [
|
|
14741
|
+
showBetaBadge ? /* @__PURE__ */ jsx16(
|
|
14742
|
+
"img",
|
|
14743
|
+
{
|
|
14744
|
+
className: "agent-gui-vinyl-player__beta",
|
|
14745
|
+
src: agent_vinyl_beta_tag_default,
|
|
14746
|
+
alt: ""
|
|
14747
|
+
}
|
|
14748
|
+
) : null,
|
|
14588
14749
|
/* @__PURE__ */ jsx16(
|
|
14589
14750
|
"img",
|
|
14590
14751
|
{
|
|
@@ -15186,10 +15347,10 @@ import { Button as Button2 } from "@tutti-os/ui-system";
|
|
|
15186
15347
|
// app/renderer/components/icons/CastIcon.tsx
|
|
15187
15348
|
import {
|
|
15188
15349
|
forwardRef as forwardRef2,
|
|
15189
|
-
useCallback as
|
|
15350
|
+
useCallback as useCallback28,
|
|
15190
15351
|
useEffect as useEffect17,
|
|
15191
15352
|
useImperativeHandle,
|
|
15192
|
-
useRef as
|
|
15353
|
+
useRef as useRef20
|
|
15193
15354
|
} from "react";
|
|
15194
15355
|
import {
|
|
15195
15356
|
motion as motion2,
|
|
@@ -15220,14 +15381,14 @@ var CastIcon = forwardRef2(
|
|
|
15220
15381
|
}, ref) => {
|
|
15221
15382
|
const controls = useAnimation();
|
|
15222
15383
|
const reduceMotion = useReducedMotion();
|
|
15223
|
-
const isControlledRef =
|
|
15224
|
-
const startAnimation =
|
|
15384
|
+
const isControlledRef = useRef20(false);
|
|
15385
|
+
const startAnimation = useCallback28(() => {
|
|
15225
15386
|
if (reduceMotion) {
|
|
15226
15387
|
return;
|
|
15227
15388
|
}
|
|
15228
15389
|
void controls.start("animate");
|
|
15229
15390
|
}, [controls, reduceMotion]);
|
|
15230
|
-
const stopAnimation =
|
|
15391
|
+
const stopAnimation = useCallback28(() => {
|
|
15231
15392
|
void controls.start("normal");
|
|
15232
15393
|
}, [controls]);
|
|
15233
15394
|
useImperativeHandle(ref, () => {
|
|
@@ -15244,7 +15405,7 @@ var CastIcon = forwardRef2(
|
|
|
15244
15405
|
}
|
|
15245
15406
|
stopAnimation();
|
|
15246
15407
|
}, [active, startAnimation, stopAnimation]);
|
|
15247
|
-
const handleMouseEnter =
|
|
15408
|
+
const handleMouseEnter = useCallback28(
|
|
15248
15409
|
(event) => {
|
|
15249
15410
|
if (isControlledRef.current) {
|
|
15250
15411
|
onMouseEnter?.(event);
|
|
@@ -15254,7 +15415,7 @@ var CastIcon = forwardRef2(
|
|
|
15254
15415
|
},
|
|
15255
15416
|
[onMouseEnter, startAnimation]
|
|
15256
15417
|
);
|
|
15257
|
-
const handleMouseLeave =
|
|
15418
|
+
const handleMouseLeave = useCallback28(
|
|
15258
15419
|
(event) => {
|
|
15259
15420
|
if (isControlledRef.current) {
|
|
15260
15421
|
onMouseLeave?.(event);
|
|
@@ -15540,7 +15701,7 @@ function AgentSessionChrome({
|
|
|
15540
15701
|
}
|
|
15541
15702
|
|
|
15542
15703
|
// agent-gui/agentGuiNode/AgentComposer.tsx
|
|
15543
|
-
import { useEffect as useEffect28, useRef as
|
|
15704
|
+
import { useEffect as useEffect28, useRef as useRef31, useState as useState20 } from "react";
|
|
15544
15705
|
import { repairMentionPaletteHighlight } from "@tutti-os/ui-rich-text/at-panel";
|
|
15545
15706
|
|
|
15546
15707
|
// agent-gui/agentGuiNode/AgentSlashStatusPanel.tsx
|
|
@@ -15670,8 +15831,8 @@ function AgentSlashStatusPanel({
|
|
|
15670
15831
|
// agent-gui/agentGuiNode/composer/useComposerDraftAttachments.ts
|
|
15671
15832
|
import { flushSync as flushSync3 } from "react-dom";
|
|
15672
15833
|
import {
|
|
15673
|
-
useCallback as
|
|
15674
|
-
useRef as
|
|
15834
|
+
useCallback as useCallback29,
|
|
15835
|
+
useRef as useRef21
|
|
15675
15836
|
} from "react";
|
|
15676
15837
|
|
|
15677
15838
|
// agent-gui/agentGuiNode/composer/composerDraftUtils.ts
|
|
@@ -15733,9 +15894,9 @@ function agentComposerDevConsoleDiagnosticSinkEnabled(runtime) {
|
|
|
15733
15894
|
|
|
15734
15895
|
// agent-gui/agentGuiNode/composer/useComposerDraftAttachments.ts
|
|
15735
15896
|
function useStableEventCallback2(callback) {
|
|
15736
|
-
const callbackRef =
|
|
15897
|
+
const callbackRef = useRef21(callback);
|
|
15737
15898
|
callbackRef.current = callback;
|
|
15738
|
-
return
|
|
15899
|
+
return useCallback29((...args) => callbackRef.current(...args), []);
|
|
15739
15900
|
}
|
|
15740
15901
|
function useComposerDraftAttachments({
|
|
15741
15902
|
workspaceId,
|
|
@@ -15789,7 +15950,7 @@ function useComposerDraftAttachments({
|
|
|
15789
15950
|
return next;
|
|
15790
15951
|
}
|
|
15791
15952
|
);
|
|
15792
|
-
const openReferencesForEntityRef =
|
|
15953
|
+
const openReferencesForEntityRef = useRef21(null);
|
|
15793
15954
|
const handleDraftChange = useStableEventCallback2(
|
|
15794
15955
|
(nextDraft) => {
|
|
15795
15956
|
if (isGoalModeActive) {
|
|
@@ -15824,7 +15985,7 @@ function useComposerDraftAttachments({
|
|
|
15824
15985
|
);
|
|
15825
15986
|
}
|
|
15826
15987
|
);
|
|
15827
|
-
const clearGoalModeBadge =
|
|
15988
|
+
const clearGoalModeBadge = useCallback29(() => {
|
|
15828
15989
|
if (!isGoalModeActive) {
|
|
15829
15990
|
return;
|
|
15830
15991
|
}
|
|
@@ -15842,7 +16003,7 @@ function useComposerDraftAttachments({
|
|
|
15842
16003
|
isGoalModeActive,
|
|
15843
16004
|
publishScopedDraft
|
|
15844
16005
|
]);
|
|
15845
|
-
const addDraftImages =
|
|
16006
|
+
const addDraftImages = useCallback29(
|
|
15846
16007
|
(images) => {
|
|
15847
16008
|
if (images.length === 0) {
|
|
15848
16009
|
return;
|
|
@@ -15986,7 +16147,7 @@ function useComposerDraftAttachments({
|
|
|
15986
16147
|
workspaceId
|
|
15987
16148
|
]
|
|
15988
16149
|
);
|
|
15989
|
-
const removeDraftImage =
|
|
16150
|
+
const removeDraftImage = useCallback29(
|
|
15990
16151
|
(id) => {
|
|
15991
16152
|
const nextDraftImages = draftImagesRef.current.filter(
|
|
15992
16153
|
(image) => image.id !== id
|
|
@@ -16004,7 +16165,7 @@ function useComposerDraftAttachments({
|
|
|
16004
16165
|
},
|
|
16005
16166
|
[draftScopeKey, publishScopedDraft]
|
|
16006
16167
|
);
|
|
16007
|
-
const removeDraftFile =
|
|
16168
|
+
const removeDraftFile = useCallback29(
|
|
16008
16169
|
(id) => {
|
|
16009
16170
|
const nextDraftFiles = draftFilesRef.current.filter(
|
|
16010
16171
|
(file) => file.id !== id
|
|
@@ -16022,7 +16183,7 @@ function useComposerDraftAttachments({
|
|
|
16022
16183
|
},
|
|
16023
16184
|
[draftScopeKey, publishScopedDraft]
|
|
16024
16185
|
);
|
|
16025
|
-
const removeDraftLargeText =
|
|
16186
|
+
const removeDraftLargeText = useCallback29(
|
|
16026
16187
|
(id) => {
|
|
16027
16188
|
const nextDraftLargeTexts = draftLargeTextsRef.current.filter(
|
|
16028
16189
|
(item) => item.id !== id
|
|
@@ -16040,7 +16201,7 @@ function useComposerDraftAttachments({
|
|
|
16040
16201
|
},
|
|
16041
16202
|
[draftScopeKey, publishScopedDraft]
|
|
16042
16203
|
);
|
|
16043
|
-
const expandDraftLargeTextToPrompt =
|
|
16204
|
+
const expandDraftLargeTextToPrompt = useCallback29(
|
|
16044
16205
|
(id) => {
|
|
16045
16206
|
const item = draftLargeTextsRef.current.find((entry) => entry.id === id);
|
|
16046
16207
|
if (!item || !item.text.trim()) {
|
|
@@ -16070,7 +16231,7 @@ ${item.text}` : item.text;
|
|
|
16070
16231
|
},
|
|
16071
16232
|
[draftScopeKey, publishScopedDraft]
|
|
16072
16233
|
);
|
|
16073
|
-
const handlePastedLargeText =
|
|
16234
|
+
const handlePastedLargeText = useCallback29(
|
|
16074
16235
|
(text) => {
|
|
16075
16236
|
const normalizedText = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
|
|
16076
16237
|
if (!normalizedText.trim()) {
|
|
@@ -16152,7 +16313,7 @@ ${item.text}` : item.text;
|
|
|
16152
16313
|
workspaceId
|
|
16153
16314
|
]
|
|
16154
16315
|
);
|
|
16155
|
-
const applyReferencePickResult =
|
|
16316
|
+
const applyReferencePickResult = useCallback29(
|
|
16156
16317
|
async (result) => {
|
|
16157
16318
|
if (result.files.length > 0) {
|
|
16158
16319
|
const uploadPromptContent = promptFileUploadSupported ? agentActivityRuntime?.uploadPromptContent : void 0;
|
|
@@ -16201,13 +16362,13 @@ ${item.text}` : item.text;
|
|
|
16201
16362
|
},
|
|
16202
16363
|
[agentActivityRuntime, promptFileUploadSupported, workspaceId]
|
|
16203
16364
|
);
|
|
16204
|
-
const handleWorkspaceReferencePicker =
|
|
16365
|
+
const handleWorkspaceReferencePicker = useCallback29(async () => {
|
|
16205
16366
|
if (!onRequestWorkspaceReferences) {
|
|
16206
16367
|
return;
|
|
16207
16368
|
}
|
|
16208
16369
|
await applyReferencePickResult(await onRequestWorkspaceReferences());
|
|
16209
16370
|
}, [applyReferencePickResult, onRequestWorkspaceReferences]);
|
|
16210
|
-
const applyDroppedFileReferences =
|
|
16371
|
+
const applyDroppedFileReferences = useCallback29(
|
|
16211
16372
|
async (files) => {
|
|
16212
16373
|
if (!promptFilesSupported || !resolveDroppedFileReferences || files.length === 0) {
|
|
16213
16374
|
return;
|
|
@@ -16224,7 +16385,7 @@ ${item.text}` : item.text;
|
|
|
16224
16385
|
resolveDroppedFileReferences
|
|
16225
16386
|
]
|
|
16226
16387
|
);
|
|
16227
|
-
const handleOpenReferencesForEntity =
|
|
16388
|
+
const handleOpenReferencesForEntity = useCallback29(
|
|
16228
16389
|
(entity) => {
|
|
16229
16390
|
if (!onRequestWorkspaceReferences) {
|
|
16230
16391
|
return;
|
|
@@ -16244,7 +16405,7 @@ ${item.text}` : item.text;
|
|
|
16244
16405
|
);
|
|
16245
16406
|
openReferencesForEntityRef.current = handleOpenReferencesForEntity;
|
|
16246
16407
|
openReferencesForEntityRef.current = handleOpenReferencesForEntity;
|
|
16247
|
-
const handleLinkClick =
|
|
16408
|
+
const handleLinkClick = useCallback29(
|
|
16248
16409
|
(href) => {
|
|
16249
16410
|
const item = parseMentionItemFromHref({ name: "", href });
|
|
16250
16411
|
if (item?.kind === "workspace-reference") {
|
|
@@ -16796,7 +16957,7 @@ function useComposerPaletteCatalog({
|
|
|
16796
16957
|
|
|
16797
16958
|
// agent-gui/agentGuiNode/composer/useMentionPaletteFrame.ts
|
|
16798
16959
|
import {
|
|
16799
|
-
useCallback as
|
|
16960
|
+
useCallback as useCallback31,
|
|
16800
16961
|
useLayoutEffect as useLayoutEffect3,
|
|
16801
16962
|
useMemo as useMemo22,
|
|
16802
16963
|
useState as useState11
|
|
@@ -16804,9 +16965,9 @@ import {
|
|
|
16804
16965
|
|
|
16805
16966
|
// agent-gui/agentGuiNode/composer/AgentComposerChrome.tsx
|
|
16806
16967
|
import {
|
|
16807
|
-
useCallback as
|
|
16968
|
+
useCallback as useCallback30,
|
|
16808
16969
|
useEffect as useEffect18,
|
|
16809
|
-
useRef as
|
|
16970
|
+
useRef as useRef22,
|
|
16810
16971
|
useState as useState10
|
|
16811
16972
|
} from "react";
|
|
16812
16973
|
import {
|
|
@@ -16817,7 +16978,7 @@ import {
|
|
|
16817
16978
|
} from "@tutti-os/ui-system";
|
|
16818
16979
|
|
|
16819
16980
|
// app/renderer/assets/icons/handoff-lined.svg
|
|
16820
|
-
var handoff_lined_default = "
|
|
16981
|
+
var handoff_lined_default = 'data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">%0A<g clip-path="url(%23clip0_3861_2885)">%0A<rect width="24" height="24" fill="black" fill-opacity="0.01"/>%0A<path d="M12.541 2.64224C13.5268 2.57725 14.7105 3.26414 14.9658 4.31119C14.9807 4.37244 14.971 4.38297 14.999 4.45279C15.0889 4.49497 15.8572 4.41273 16.1084 4.44888C16.6718 4.53003 17.3283 4.81738 17.6679 5.29068C18.3576 6.25256 18.1372 7.15346 17.9668 8.23795C17.891 8.71986 17.8512 9.18553 17.7841 9.66177C18.6508 9.38411 19.6929 9.3859 20.3828 10.0436C20.9482 10.5828 21.022 10.9891 20.9707 11.7506C20.9128 12.6101 20.7133 13.4205 20.5381 14.2594C20.4156 14.8393 20.3126 15.4234 20.1748 15.9997C19.4485 18.9205 17.1783 21.1354 14.1855 21.6169C13.2872 21.7614 12.2326 21.7234 11.3154 21.8883C11.0306 21.9395 10.5122 21.8928 10.2041 21.8737C8.39117 21.7381 6.83082 21.0208 5.55368 19.7018C4.56317 18.6788 3.76665 16.85 3.4736 15.4499C3.27634 14.5072 3.21936 13.2571 3.05173 12.2594C2.92224 11.4892 2.63431 9.90484 2.66306 9.19595C2.69683 8.52466 2.99466 7.89414 3.49118 7.44107C4.00634 6.96741 4.73785 6.86941 5.40915 6.8981C5.26761 6.12888 5.17335 6.00537 5.47849 5.24673C6.26 3.30387 9.35257 3.09898 10.1269 5.15591C10.4457 3.7735 10.9671 2.83356 12.4736 2.6481C12.496 2.64536 12.5185 2.64365 12.541 2.64224ZM7.65329 5.28287C7.34224 5.39341 7.04943 5.51492 6.89841 5.83658C6.87441 5.88847 6.85129 5.94173 6.83005 5.99478C6.84839 6.41774 7.06208 7.04203 7.15817 7.46646C7.52295 9.07758 8.00711 10.6594 8.13474 12.3151C8.16969 12.7687 8.10092 12.9325 7.81833 13.2829C7.39918 13.433 7.31867 13.3947 6.87106 13.3239C6.79013 13.194 6.70881 13.0713 6.65622 12.9128C6.49424 12.424 6.54192 11.9679 6.41599 11.4645C6.21294 10.6528 6.08263 9.60287 5.76266 8.84439C5.65375 8.5874 4.91332 8.33972 4.70407 8.52701C4.33418 8.74784 4.174 9.07895 4.23239 9.50357C4.37588 10.5311 4.54178 11.5642 4.69919 12.5905C4.84794 13.6103 4.89935 14.7715 5.16403 15.7653C5.32709 16.3774 5.8209 17.4421 6.16403 17.9606C6.94094 19.1217 8.14863 19.9258 9.5195 20.195C11.0801 20.5085 12.8188 20.2648 14.1318 19.3473C15.1047 18.6673 15.3727 18.2725 15.9267 17.2819C16.8241 15.5121 16.3967 13.5316 16.2441 11.6442C16.2247 11.4043 16.1772 10.8032 15.955 10.6823C15.5703 10.5916 15.1103 11.0915 14.9013 11.3747C14.8058 12.1456 14.8548 12.899 14.8808 13.6725C14.9036 14.3491 14.979 14.9579 14.2168 15.2184C13.0143 14.9531 13.3798 14.1651 13.2724 13.2438C13.0766 11.5645 13.1952 7.84899 12.2187 6.50552C12.0063 6.39593 11.8598 6.35441 11.6279 6.29556C11.2456 6.3937 11.0664 6.49764 10.8252 6.83755C10.826 7.52781 11.0772 8.09418 11.1601 8.75552C11.296 9.96436 11.4554 11.2031 11.4472 12.4196C11.4402 13.4156 9.94736 13.3695 9.90329 12.5114C9.80551 10.594 9.27439 8.78583 8.98825 6.8981C8.84693 5.96551 8.82536 5.2274 7.65329 5.28287ZM18.79 11.0602C18.3666 11.1286 18.1324 11.2288 17.8457 11.5719C17.8416 12.006 17.944 12.8819 18 13.3678C18.1526 14.6926 18.0601 16.0194 17.6699 17.2985C17.5713 17.6217 17.2346 18.1239 17.0879 18.4733C17.1733 18.3779 17.2854 18.259 17.3603 18.1588C17.7942 17.613 18.0218 17.3011 18.2988 16.6364C18.4293 16.3174 18.5396 15.9898 18.6289 15.6569C18.7615 15.1552 18.8619 14.597 18.9638 14.0895C19.1437 13.1941 19.3738 12.2827 19.416 11.3708C19.4287 11.0806 18.9619 11.0667 18.79 11.0602ZM15.6006 5.99088C15.3568 6.09677 14.9873 6.2966 14.9345 6.55826C14.7769 7.34556 14.5456 8.7319 14.5664 9.49088C14.8154 9.39809 15.0902 9.28813 15.3457 9.22525C15.6499 9.18296 15.9353 9.14924 16.2431 9.14322C16.291 8.79009 16.3293 8.44362 16.3818 8.09048C16.4534 7.6096 16.6054 6.9758 16.5908 6.49869C16.3227 6.07678 16.0915 5.97202 15.6006 5.99088ZM21.0615 7.0065C21.6953 7.12329 21.9585 7.85598 21.4785 8.29068C21.118 8.617 20.8665 8.63861 20.4746 8.63638C19.7722 8.50674 19.6929 8.11655 19.7959 7.48795C20.2895 7.07061 20.4128 7.02325 21.0498 7.00845C21.0537 7.00789 21.0576 7.00707 21.0615 7.0065ZM19.5127 4.57584C20.3899 4.65155 20.4491 5.15673 20.2412 5.88541C20.007 6.11731 19.757 6.3455 19.4375 6.44205C19.0358 6.39425 18.9416 6.32032 18.6582 6.04849C18.5562 5.25112 18.7461 4.8368 19.5127 4.57584ZM12.4502 4.19107C12.2196 4.29653 12.0348 4.53157 11.8662 4.72232C12.5314 4.92175 12.7055 4.93493 13.2549 5.37369L13.498 5.56998C13.512 5.35527 13.5375 5.09491 13.542 4.88443C13.3625 4.57804 13.2165 4.3764 12.8994 4.18619C12.7541 4.18732 12.5938 4.18576 12.4502 4.19107Z" fill="black"/>%0A</g>%0A<defs>%0A<clipPath id="clip0_3861_2885">%0A<rect width="24" height="24" fill="white"/>%0A</clipPath>%0A</defs>%0A</svg>%0A';
|
|
16821
16982
|
|
|
16822
16983
|
// agent-gui/agentGuiNode/composer/AgentComposerChrome.tsx
|
|
16823
16984
|
import { jsx as jsx21, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
@@ -16854,32 +17015,32 @@ function AgentUsageChip({
|
|
|
16854
17015
|
}) {
|
|
16855
17016
|
"use memo";
|
|
16856
17017
|
const [usagePopoverOpen, setUsagePopoverOpen] = useState10(false);
|
|
16857
|
-
const usagePopoverHoverTimerRef =
|
|
16858
|
-
const usagePopoverContentRef =
|
|
17018
|
+
const usagePopoverHoverTimerRef = useRef22(null);
|
|
17019
|
+
const usagePopoverContentRef = useRef22(null);
|
|
16859
17020
|
const clampedPercent = Math.max(0, Math.min(100, percentUsed));
|
|
16860
17021
|
const chipLabel = labels.usageChipLabel({ percent: clampedPercent });
|
|
16861
17022
|
const showTokens = usedTokens !== null && totalTokens !== null;
|
|
16862
17023
|
const usageLevel = agentUsageChipLevel(clampedPercent);
|
|
16863
17024
|
const ringColor = agentUsageRingColor(usageLevel);
|
|
16864
|
-
const usagePopoverCloseTimerRef =
|
|
16865
|
-
const clearUsagePopoverHoverTimer =
|
|
17025
|
+
const usagePopoverCloseTimerRef = useRef22(null);
|
|
17026
|
+
const clearUsagePopoverHoverTimer = useCallback30(() => {
|
|
16866
17027
|
if (usagePopoverHoverTimerRef.current) {
|
|
16867
17028
|
clearTimeout(usagePopoverHoverTimerRef.current);
|
|
16868
17029
|
usagePopoverHoverTimerRef.current = null;
|
|
16869
17030
|
}
|
|
16870
17031
|
}, []);
|
|
16871
|
-
const clearUsagePopoverCloseTimer =
|
|
17032
|
+
const clearUsagePopoverCloseTimer = useCallback30(() => {
|
|
16872
17033
|
if (usagePopoverCloseTimerRef.current) {
|
|
16873
17034
|
clearTimeout(usagePopoverCloseTimerRef.current);
|
|
16874
17035
|
usagePopoverCloseTimerRef.current = null;
|
|
16875
17036
|
}
|
|
16876
17037
|
}, []);
|
|
16877
|
-
const openUsagePopover =
|
|
17038
|
+
const openUsagePopover = useCallback30(() => {
|
|
16878
17039
|
clearUsagePopoverHoverTimer();
|
|
16879
17040
|
clearUsagePopoverCloseTimer();
|
|
16880
17041
|
setUsagePopoverOpen(true);
|
|
16881
17042
|
}, [clearUsagePopoverCloseTimer, clearUsagePopoverHoverTimer]);
|
|
16882
|
-
const openUsagePopoverAfterHoverDelay =
|
|
17043
|
+
const openUsagePopoverAfterHoverDelay = useCallback30(() => {
|
|
16883
17044
|
clearUsagePopoverHoverTimer();
|
|
16884
17045
|
clearUsagePopoverCloseTimer();
|
|
16885
17046
|
usagePopoverHoverTimerRef.current = setTimeout(() => {
|
|
@@ -16887,12 +17048,12 @@ function AgentUsageChip({
|
|
|
16887
17048
|
setUsagePopoverOpen(true);
|
|
16888
17049
|
}, USAGE_POPOVER_HOVER_DELAY_MS);
|
|
16889
17050
|
}, [clearUsagePopoverCloseTimer, clearUsagePopoverHoverTimer]);
|
|
16890
|
-
const closeUsagePopover =
|
|
17051
|
+
const closeUsagePopover = useCallback30(() => {
|
|
16891
17052
|
clearUsagePopoverHoverTimer();
|
|
16892
17053
|
clearUsagePopoverCloseTimer();
|
|
16893
17054
|
setUsagePopoverOpen(false);
|
|
16894
17055
|
}, [clearUsagePopoverCloseTimer, clearUsagePopoverHoverTimer]);
|
|
16895
|
-
const scheduleUsagePopoverClose =
|
|
17056
|
+
const scheduleUsagePopoverClose = useCallback30(() => {
|
|
16896
17057
|
clearUsagePopoverHoverTimer();
|
|
16897
17058
|
clearUsagePopoverCloseTimer();
|
|
16898
17059
|
usagePopoverCloseTimerRef.current = setTimeout(() => {
|
|
@@ -16900,7 +17061,7 @@ function AgentUsageChip({
|
|
|
16900
17061
|
setUsagePopoverOpen(false);
|
|
16901
17062
|
}, 140);
|
|
16902
17063
|
}, [clearUsagePopoverCloseTimer, clearUsagePopoverHoverTimer]);
|
|
16903
|
-
const handleUsagePopoverOpenChange =
|
|
17064
|
+
const handleUsagePopoverOpenChange = useCallback30(
|
|
16904
17065
|
(open) => {
|
|
16905
17066
|
if (open) {
|
|
16906
17067
|
openUsagePopover();
|
|
@@ -16910,7 +17071,7 @@ function AgentUsageChip({
|
|
|
16910
17071
|
},
|
|
16911
17072
|
[closeUsagePopover, openUsagePopover]
|
|
16912
17073
|
);
|
|
16913
|
-
const handleUsageTriggerBlur =
|
|
17074
|
+
const handleUsageTriggerBlur = useCallback30(
|
|
16914
17075
|
(event) => {
|
|
16915
17076
|
const nextFocusTarget = event.relatedTarget;
|
|
16916
17077
|
if (nextFocusTarget instanceof Node && usagePopoverContentRef.current?.contains(nextFocusTarget)) {
|
|
@@ -17203,7 +17364,7 @@ function AgentComposerHandoffIcon({
|
|
|
17203
17364
|
// agent-gui/agentGuiNode/composer/useMentionPaletteFrame.ts
|
|
17204
17365
|
function useMentionPaletteFrame(inputShellRef, showFileMentionPalette) {
|
|
17205
17366
|
const [mentionPaletteFrame, setMentionPaletteFrame] = useState11(null);
|
|
17206
|
-
const syncMentionPaletteFrame =
|
|
17367
|
+
const syncMentionPaletteFrame = useCallback31(() => {
|
|
17207
17368
|
const anchor = inputShellRef.current;
|
|
17208
17369
|
if (!anchor || typeof window === "undefined") {
|
|
17209
17370
|
setMentionPaletteFrame(null);
|
|
@@ -17285,14 +17446,14 @@ function useMentionPaletteFrame(inputShellRef, showFileMentionPalette) {
|
|
|
17285
17446
|
|
|
17286
17447
|
// agent-gui/agentGuiNode/composer/useComposerSlashActions.ts
|
|
17287
17448
|
import {
|
|
17288
|
-
useCallback as
|
|
17449
|
+
useCallback as useCallback32,
|
|
17289
17450
|
useMemo as useMemo23,
|
|
17290
|
-
useRef as
|
|
17451
|
+
useRef as useRef23
|
|
17291
17452
|
} from "react";
|
|
17292
17453
|
function useStableEventCallback3(callback) {
|
|
17293
|
-
const callbackRef =
|
|
17454
|
+
const callbackRef = useRef23(callback);
|
|
17294
17455
|
callbackRef.current = callback;
|
|
17295
|
-
return
|
|
17456
|
+
return useCallback32((...args) => callbackRef.current(...args), []);
|
|
17296
17457
|
}
|
|
17297
17458
|
function useComposerSlashActions(input) {
|
|
17298
17459
|
const {
|
|
@@ -17338,13 +17499,13 @@ function useComposerSlashActions(input) {
|
|
|
17338
17499
|
setIsSlashStatusPanelOpen,
|
|
17339
17500
|
setHighlightedIndex
|
|
17340
17501
|
} = input;
|
|
17341
|
-
const clearSlashCommandDraft =
|
|
17502
|
+
const clearSlashCommandDraft = useCallback32(() => {
|
|
17342
17503
|
draftPromptRef.current = "";
|
|
17343
17504
|
setPaletteDraftPrompt("");
|
|
17344
17505
|
setIsPaletteOpen(false);
|
|
17345
17506
|
onDraftContentChange(emptyAgentComposerDraft());
|
|
17346
17507
|
}, [onDraftContentChange]);
|
|
17347
|
-
const closeSlashStatusPanel =
|
|
17508
|
+
const closeSlashStatusPanel = useCallback32(() => {
|
|
17348
17509
|
setIsSlashStatusPanelOpen(false);
|
|
17349
17510
|
}, []);
|
|
17350
17511
|
const settingsControlsDisabled = isSendingTurn || isSubmittingPrompt || showStopButton;
|
|
@@ -17355,15 +17516,15 @@ function useComposerSlashActions(input) {
|
|
|
17355
17516
|
showStopButton
|
|
17356
17517
|
});
|
|
17357
17518
|
const composerControlsHardDisabled = isSelectedProjectMissing || isSubmittingPrompt || disabled && !isSendingTurn && !showStopButton;
|
|
17358
|
-
const closeReviewPicker =
|
|
17519
|
+
const closeReviewPicker = useCallback32(() => {
|
|
17359
17520
|
setIsReviewPickerOpen(false);
|
|
17360
17521
|
}, []);
|
|
17361
|
-
const closeSlashFloatingMenu =
|
|
17522
|
+
const closeSlashFloatingMenu = useCallback32(() => {
|
|
17362
17523
|
setIsSlashStatusPanelOpen(false);
|
|
17363
17524
|
setIsReviewPickerOpen(false);
|
|
17364
17525
|
setIsPaletteOpen(false);
|
|
17365
17526
|
}, []);
|
|
17366
|
-
const submitReviewCommand =
|
|
17527
|
+
const submitReviewCommand = useCallback32(
|
|
17367
17528
|
(command) => {
|
|
17368
17529
|
setIsReviewPickerOpen(false);
|
|
17369
17530
|
clearSlashCommandDraft();
|
|
@@ -17383,7 +17544,7 @@ function useComposerSlashActions(input) {
|
|
|
17383
17544
|
}
|
|
17384
17545
|
return null;
|
|
17385
17546
|
}, [onRequestGitBranches, selectedProjectPath, slashStatusAgentSessionId]);
|
|
17386
|
-
const executeSlashCommandEffect =
|
|
17547
|
+
const executeSlashCommandEffect = useCallback32(
|
|
17387
17548
|
(effect) => {
|
|
17388
17549
|
if (effect.kind === "submitPrompt") {
|
|
17389
17550
|
clearSlashCommandDraft();
|
|
@@ -17493,7 +17654,7 @@ function useComposerSlashActions(input) {
|
|
|
17493
17654
|
settingsControlsDisabled
|
|
17494
17655
|
]
|
|
17495
17656
|
);
|
|
17496
|
-
const selectCommand =
|
|
17657
|
+
const selectCommand = useCallback32(
|
|
17497
17658
|
(command) => {
|
|
17498
17659
|
const selectionEffect = resolveSlashCommandSelectionEffect({
|
|
17499
17660
|
provider,
|
|
@@ -17507,7 +17668,7 @@ function useComposerSlashActions(input) {
|
|
|
17507
17668
|
},
|
|
17508
17669
|
[executeSlashCommandEffect, provider, slashCommandPolicy]
|
|
17509
17670
|
);
|
|
17510
|
-
const selectCapability =
|
|
17671
|
+
const selectCapability = useCallback32(
|
|
17511
17672
|
(capability) => {
|
|
17512
17673
|
const selectionEffect = resolveSlashCommandSelectionEffect({
|
|
17513
17674
|
provider,
|
|
@@ -17521,14 +17682,14 @@ function useComposerSlashActions(input) {
|
|
|
17521
17682
|
},
|
|
17522
17683
|
[executeSlashCommandEffect, provider, slashCommandPolicy]
|
|
17523
17684
|
);
|
|
17524
|
-
const selectCapabilitySettings =
|
|
17685
|
+
const selectCapabilitySettings = useCallback32(
|
|
17525
17686
|
(capability) => {
|
|
17526
17687
|
onCapabilitySettingsRequest?.(capability.capability);
|
|
17527
17688
|
setIsPaletteOpen(false);
|
|
17528
17689
|
},
|
|
17529
17690
|
[onCapabilitySettingsRequest]
|
|
17530
17691
|
);
|
|
17531
|
-
const selectSkill =
|
|
17692
|
+
const selectSkill = useCallback32(
|
|
17532
17693
|
(skill) => {
|
|
17533
17694
|
const trigger = skillTriggerForPrefix(skill, skillQueryMatch?.prefix);
|
|
17534
17695
|
const replacedDraft = trigger && skillQueryMatch && promptBeforeSelection !== "" ? editorHandleRef.current?.replaceTextBeforeSelection(
|
|
@@ -17625,7 +17786,7 @@ function useComposerSlashActions(input) {
|
|
|
17625
17786
|
}
|
|
17626
17787
|
}
|
|
17627
17788
|
);
|
|
17628
|
-
const submit =
|
|
17789
|
+
const submit = useCallback32(
|
|
17629
17790
|
(event) => {
|
|
17630
17791
|
event.preventDefault();
|
|
17631
17792
|
submitCurrentPrompt();
|
|
@@ -17709,9 +17870,9 @@ function useComposerSlashActions(input) {
|
|
|
17709
17870
|
|
|
17710
17871
|
// agent-gui/agentGuiNode/composer/useComposerMentionActions.ts
|
|
17711
17872
|
import {
|
|
17712
|
-
useCallback as
|
|
17873
|
+
useCallback as useCallback33,
|
|
17713
17874
|
useEffect as useEffect19,
|
|
17714
|
-
useRef as
|
|
17875
|
+
useRef as useRef24
|
|
17715
17876
|
} from "react";
|
|
17716
17877
|
import {
|
|
17717
17878
|
createMentionPaletteStateAdapter,
|
|
@@ -17731,9 +17892,9 @@ function isAgentRichTextImeComposing(event) {
|
|
|
17731
17892
|
|
|
17732
17893
|
// agent-gui/agentGuiNode/composer/useComposerMentionActions.ts
|
|
17733
17894
|
function useStableEventCallback4(callback) {
|
|
17734
|
-
const callbackRef =
|
|
17895
|
+
const callbackRef = useRef24(callback);
|
|
17735
17896
|
callbackRef.current = callback;
|
|
17736
|
-
return
|
|
17897
|
+
return useCallback33((...args) => callbackRef.current(...args), []);
|
|
17737
17898
|
}
|
|
17738
17899
|
function useComposerMentionActions(input) {
|
|
17739
17900
|
const {
|
|
@@ -17769,7 +17930,7 @@ function useComposerMentionActions(input) {
|
|
|
17769
17930
|
paletteContentRef,
|
|
17770
17931
|
shouldCenterMentionHighlight
|
|
17771
17932
|
} = input;
|
|
17772
|
-
const selectFileMention =
|
|
17933
|
+
const selectFileMention = useCallback33(
|
|
17773
17934
|
(entry) => {
|
|
17774
17935
|
if (entry.kind === "file" && entry.mentionNavigation === "agent-generated-folder-back" && mentionControllerRef.current?.selectAgentGeneratedMentionItem(entry)) {
|
|
17775
17936
|
return;
|
|
@@ -17784,7 +17945,7 @@ function useComposerMentionActions(input) {
|
|
|
17784
17945
|
},
|
|
17785
17946
|
[fileMentionSuggestion]
|
|
17786
17947
|
);
|
|
17787
|
-
const closeFileMentionPalette =
|
|
17948
|
+
const closeFileMentionPalette = useCallback33(() => {
|
|
17788
17949
|
if (fileMentionSuggestion) {
|
|
17789
17950
|
exitAgentFileMentionSuggestion(fileMentionSuggestion.editor);
|
|
17790
17951
|
}
|
|
@@ -17792,7 +17953,7 @@ function useComposerMentionActions(input) {
|
|
|
17792
17953
|
setFileMentionSuggestion(null);
|
|
17793
17954
|
setIsPaletteOpen(false);
|
|
17794
17955
|
}, [fileMentionSuggestion]);
|
|
17795
|
-
const clearActiveFileMentionTrigger =
|
|
17956
|
+
const clearActiveFileMentionTrigger = useCallback33(() => {
|
|
17796
17957
|
if (!fileMentionSuggestion) {
|
|
17797
17958
|
return;
|
|
17798
17959
|
}
|
|
@@ -17810,14 +17971,14 @@ function useComposerMentionActions(input) {
|
|
|
17810
17971
|
updateAgentComposerDraft(draftContent, { prompt: nextDraft })
|
|
17811
17972
|
);
|
|
17812
17973
|
}, [draftContent, fileMentionSuggestion, onDraftContentChange]);
|
|
17813
|
-
const closeOpenPalette =
|
|
17974
|
+
const closeOpenPalette = useCallback33(() => {
|
|
17814
17975
|
if (showFileMentionPalette) {
|
|
17815
17976
|
closeFileMentionPalette();
|
|
17816
17977
|
return;
|
|
17817
17978
|
}
|
|
17818
17979
|
setIsPaletteOpen(false);
|
|
17819
17980
|
}, [closeFileMentionPalette, showFileMentionPalette]);
|
|
17820
|
-
const createFileMentionPaletteAdapter =
|
|
17981
|
+
const createFileMentionPaletteAdapter = useCallback33(
|
|
17821
17982
|
(highlightedKey = mentionHighlightedKey) => createMentionPaletteStateAdapter({
|
|
17822
17983
|
state: mentionSearchState,
|
|
17823
17984
|
highlightedKey,
|
|
@@ -17846,23 +18007,23 @@ function useComposerMentionActions(input) {
|
|
|
17846
18007
|
}),
|
|
17847
18008
|
[mentionHighlightedKey, mentionSearchState, selectFileMention]
|
|
17848
18009
|
);
|
|
17849
|
-
const moveFileMentionSelection =
|
|
18010
|
+
const moveFileMentionSelection = useCallback33(
|
|
17850
18011
|
(delta) => {
|
|
17851
18012
|
createFileMentionPaletteAdapter().moveSelection(delta);
|
|
17852
18013
|
},
|
|
17853
18014
|
[createFileMentionPaletteAdapter]
|
|
17854
18015
|
);
|
|
17855
|
-
const handleMentionHighlightChange =
|
|
18016
|
+
const handleMentionHighlightChange = useCallback33((key) => {
|
|
17856
18017
|
autoMentionHighlightedKeyRef.current = null;
|
|
17857
18018
|
setMentionHighlightedKey(key);
|
|
17858
18019
|
}, []);
|
|
17859
|
-
const cycleFileMentionFilter =
|
|
18020
|
+
const cycleFileMentionFilter = useCallback33(
|
|
17860
18021
|
(delta = 1) => {
|
|
17861
18022
|
createFileMentionPaletteAdapter().cycleCategory(delta);
|
|
17862
18023
|
},
|
|
17863
18024
|
[createFileMentionPaletteAdapter]
|
|
17864
18025
|
);
|
|
17865
|
-
const navigateFileMentionHierarchy =
|
|
18026
|
+
const navigateFileMentionHierarchy = useCallback33(
|
|
17866
18027
|
(delta) => {
|
|
17867
18028
|
if (delta === -1) {
|
|
17868
18029
|
return mentionControllerRef.current?.exitAgentGeneratedBrowse() ?? false;
|
|
@@ -17878,13 +18039,13 @@ function useComposerMentionActions(input) {
|
|
|
17878
18039
|
},
|
|
17879
18040
|
[createFileMentionPaletteAdapter]
|
|
17880
18041
|
);
|
|
17881
|
-
const navigateIntoFileMentionItem =
|
|
18042
|
+
const navigateIntoFileMentionItem = useCallback33(
|
|
17882
18043
|
(item) => {
|
|
17883
18044
|
mentionControllerRef.current?.selectAgentGeneratedMentionItem(item);
|
|
17884
18045
|
},
|
|
17885
18046
|
[]
|
|
17886
18047
|
);
|
|
17887
|
-
const handleFileMentionKeyDown =
|
|
18048
|
+
const handleFileMentionKeyDown = useCallback33(
|
|
17888
18049
|
(event) => {
|
|
17889
18050
|
if (!showFileMentionPalette) {
|
|
17890
18051
|
return false;
|
|
@@ -17911,7 +18072,7 @@ function useComposerMentionActions(input) {
|
|
|
17911
18072
|
showFileMentionPalette
|
|
17912
18073
|
]
|
|
17913
18074
|
);
|
|
17914
|
-
const handlePlanModeToggleKeyDown =
|
|
18075
|
+
const handlePlanModeToggleKeyDown = useCallback33(
|
|
17915
18076
|
(event) => {
|
|
17916
18077
|
if (event.key !== "Tab" || !event.shiftKey || event.metaKey || event.ctrlKey || event.altKey) {
|
|
17917
18078
|
return false;
|
|
@@ -17966,7 +18127,7 @@ function useComposerMentionActions(input) {
|
|
|
17966
18127
|
});
|
|
17967
18128
|
};
|
|
17968
18129
|
}, [handlePaletteKeyDown, showPalette, workspaceReferencePickerOpen]);
|
|
17969
|
-
const handleFileMentionSuggestionChange =
|
|
18130
|
+
const handleFileMentionSuggestionChange = useCallback33(
|
|
17970
18131
|
(state) => {
|
|
17971
18132
|
setFileMentionSuggestion(state);
|
|
17972
18133
|
if (!state) {
|
|
@@ -18111,7 +18272,7 @@ function useComposerProviderTargets(input) {
|
|
|
18111
18272
|
}
|
|
18112
18273
|
|
|
18113
18274
|
// agent-gui/agentGuiNode/composer/useComposerFocusAndDrop.ts
|
|
18114
|
-
import { useCallback as
|
|
18275
|
+
import { useCallback as useCallback34, useEffect as useEffect21 } from "react";
|
|
18115
18276
|
|
|
18116
18277
|
// agent-gui/agentGuiNode/composer/useComposerFileDrop.ts
|
|
18117
18278
|
import { useEffect as useEffect20, useState as useState12 } from "react";
|
|
@@ -18492,13 +18653,13 @@ function useComposerFocusAndDrop(input) {
|
|
|
18492
18653
|
applyDroppedFileReferences,
|
|
18493
18654
|
onPromptImagesUnsupported
|
|
18494
18655
|
} = input;
|
|
18495
|
-
const handleMentionPaletteButton =
|
|
18656
|
+
const handleMentionPaletteButton = useCallback34(() => {
|
|
18496
18657
|
if (composerControlsHardDisabled || inputDisabled) {
|
|
18497
18658
|
return;
|
|
18498
18659
|
}
|
|
18499
18660
|
editorHandleRef.current?.openMentionPalette();
|
|
18500
18661
|
}, [composerControlsHardDisabled, inputDisabled]);
|
|
18501
|
-
const scheduleComposerFocus =
|
|
18662
|
+
const scheduleComposerFocus = useCallback34(() => {
|
|
18502
18663
|
if (inputDisabled) {
|
|
18503
18664
|
return;
|
|
18504
18665
|
}
|
|
@@ -18508,7 +18669,7 @@ function useComposerFocusAndDrop(input) {
|
|
|
18508
18669
|
});
|
|
18509
18670
|
});
|
|
18510
18671
|
}, [inputDisabled]);
|
|
18511
|
-
const handlePastedImages =
|
|
18672
|
+
const handlePastedImages = useCallback34(
|
|
18512
18673
|
(images) => {
|
|
18513
18674
|
addDraftImages(images);
|
|
18514
18675
|
scheduleComposerFocus();
|
|
@@ -18553,7 +18714,7 @@ function useComposerFocusAndDrop(input) {
|
|
|
18553
18714
|
|
|
18554
18715
|
// agent-gui/agentGuiNode/composer/useComposerPresentation.tsx
|
|
18555
18716
|
import {
|
|
18556
|
-
useCallback as
|
|
18717
|
+
useCallback as useCallback35,
|
|
18557
18718
|
useEffect as useEffect22,
|
|
18558
18719
|
useState as useState14
|
|
18559
18720
|
} from "react";
|
|
@@ -18814,7 +18975,7 @@ function useComposerPresentation(input) {
|
|
|
18814
18975
|
useEffect22(() => {
|
|
18815
18976
|
setDismissedPromptRequestId(null);
|
|
18816
18977
|
}, [activePromptRequestId]);
|
|
18817
|
-
const submitInteractivePromptAndDismiss =
|
|
18978
|
+
const submitInteractivePromptAndDismiss = useCallback35(
|
|
18818
18979
|
(input2) => {
|
|
18819
18980
|
onSubmitInteractivePrompt(input2);
|
|
18820
18981
|
setDismissedPromptRequestId(input2.requestId);
|
|
@@ -18945,7 +19106,7 @@ import {
|
|
|
18945
19106
|
import {
|
|
18946
19107
|
Component as Component2,
|
|
18947
19108
|
useLayoutEffect as useLayoutEffect4,
|
|
18948
|
-
useRef as
|
|
19109
|
+
useRef as useRef25,
|
|
18949
19110
|
useState as useState15
|
|
18950
19111
|
} from "react";
|
|
18951
19112
|
import { ChevronRight } from "lucide-react";
|
|
@@ -19227,9 +19388,9 @@ function AgentQueuedPromptPanel({
|
|
|
19227
19388
|
"use memo";
|
|
19228
19389
|
const runtime = useOptionalAgentActivityRuntime();
|
|
19229
19390
|
const [isExpanded, setIsExpanded] = useState15(false);
|
|
19230
|
-
const singlePromptTextRef =
|
|
19231
|
-
const queuedPromptListRef =
|
|
19232
|
-
const pointerHandledEditPromptIdRef =
|
|
19391
|
+
const singlePromptTextRef = useRef25(null);
|
|
19392
|
+
const queuedPromptListRef = useRef25(null);
|
|
19393
|
+
const pointerHandledEditPromptIdRef = useRef25(null);
|
|
19233
19394
|
const [isSinglePromptOverflowing, setIsSinglePromptOverflowing] = useState15(false);
|
|
19234
19395
|
const [expandedListMaxHeightPx, setExpandedListMaxHeightPx] = useState15(280);
|
|
19235
19396
|
const singlePromptHasImages = queuedPrompts.length === 1 && queuedPromptImages(queuedPrompts[0]).length > 0;
|
|
@@ -20568,10 +20729,10 @@ function ComposerModelOptionTooltip({
|
|
|
20568
20729
|
// agent-gui/agentGuiNode/agentRichText/AgentRichTextEditor.tsx
|
|
20569
20730
|
import {
|
|
20570
20731
|
forwardRef as forwardRef3,
|
|
20571
|
-
useCallback as
|
|
20732
|
+
useCallback as useCallback37,
|
|
20572
20733
|
useEffect as useEffect24,
|
|
20573
20734
|
useMemo as useMemo26,
|
|
20574
|
-
useRef as
|
|
20735
|
+
useRef as useRef27,
|
|
20575
20736
|
useState as useState17
|
|
20576
20737
|
} from "react";
|
|
20577
20738
|
import { useEditor } from "@tiptap/react";
|
|
@@ -21098,8 +21259,8 @@ function useAgentRichTextEditorHandle(input) {
|
|
|
21098
21259
|
|
|
21099
21260
|
// agent-gui/agentGuiNode/agentRichText/AgentRichTextEditorSurface.tsx
|
|
21100
21261
|
import {
|
|
21101
|
-
useCallback as
|
|
21102
|
-
useRef as
|
|
21262
|
+
useCallback as useCallback36,
|
|
21263
|
+
useRef as useRef26
|
|
21103
21264
|
} from "react";
|
|
21104
21265
|
import { createPortal as createPortal2 } from "react-dom";
|
|
21105
21266
|
import { EditorContent } from "@tiptap/react";
|
|
@@ -21187,8 +21348,8 @@ function AgentRichTextContextMenuButton({
|
|
|
21187
21348
|
label,
|
|
21188
21349
|
onSelect
|
|
21189
21350
|
}) {
|
|
21190
|
-
const selectionStartedRef =
|
|
21191
|
-
const select =
|
|
21351
|
+
const selectionStartedRef = useRef26(false);
|
|
21352
|
+
const select = useCallback36(() => {
|
|
21192
21353
|
if (disabled || selectionStartedRef.current) return;
|
|
21193
21354
|
selectionStartedRef.current = true;
|
|
21194
21355
|
void Promise.resolve(onSelect()).finally(() => {
|
|
@@ -21289,39 +21450,39 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
|
|
|
21289
21450
|
}, ref) {
|
|
21290
21451
|
"use memo";
|
|
21291
21452
|
const { t } = useTranslation();
|
|
21292
|
-
const lastEmittedPromptRef =
|
|
21293
|
-
const editorRef =
|
|
21294
|
-
const onChangeRef =
|
|
21295
|
-
const onFocusRef =
|
|
21296
|
-
const onUserContentChangeRef =
|
|
21297
|
-
const pendingFocusMethodRef =
|
|
21298
|
-
const onSubmitRef =
|
|
21299
|
-
const onSubmitGuidanceRef =
|
|
21300
|
-
const onKeyDownForPaletteRef =
|
|
21301
|
-
const onFileMentionSuggestionChangeRef =
|
|
21453
|
+
const lastEmittedPromptRef = useRef27(value);
|
|
21454
|
+
const editorRef = useRef27(null);
|
|
21455
|
+
const onChangeRef = useRef27(onChange);
|
|
21456
|
+
const onFocusRef = useRef27(onFocus);
|
|
21457
|
+
const onUserContentChangeRef = useRef27(onUserContentChange);
|
|
21458
|
+
const pendingFocusMethodRef = useRef27(null);
|
|
21459
|
+
const onSubmitRef = useRef27(onSubmit);
|
|
21460
|
+
const onSubmitGuidanceRef = useRef27(onSubmitGuidance);
|
|
21461
|
+
const onKeyDownForPaletteRef = useRef27(onKeyDownForPalette);
|
|
21462
|
+
const onFileMentionSuggestionChangeRef = useRef27(
|
|
21302
21463
|
onFileMentionSuggestionChange
|
|
21303
21464
|
);
|
|
21304
|
-
const onFileMentionSuggestionKeyDownRef =
|
|
21465
|
+
const onFileMentionSuggestionKeyDownRef = useRef27(
|
|
21305
21466
|
onFileMentionSuggestionKeyDown
|
|
21306
21467
|
);
|
|
21307
|
-
const onLinkClickRef =
|
|
21308
|
-
const onPromptImagesUnsupportedRef =
|
|
21309
|
-
const onPasteImagesRef =
|
|
21310
|
-
const onPasteLargeTextRef =
|
|
21311
|
-
const onDropFilesRef =
|
|
21312
|
-
const promptImagesSupportedRef =
|
|
21313
|
-
const getReferenceForFileRef =
|
|
21314
|
-
const placeholderRef =
|
|
21315
|
-
const removeMentionLabelRef =
|
|
21316
|
-
const availableSkillsRef =
|
|
21317
|
-
const availableCapabilitiesRef =
|
|
21318
|
-
const suppressPastedAtSuggestionRef =
|
|
21319
|
-
const scrollFrameRef =
|
|
21468
|
+
const onLinkClickRef = useRef27(onLinkClick);
|
|
21469
|
+
const onPromptImagesUnsupportedRef = useRef27(onPromptImagesUnsupported);
|
|
21470
|
+
const onPasteImagesRef = useRef27(onPasteImages);
|
|
21471
|
+
const onPasteLargeTextRef = useRef27(onPasteLargeText);
|
|
21472
|
+
const onDropFilesRef = useRef27(onDropFiles);
|
|
21473
|
+
const promptImagesSupportedRef = useRef27(promptImagesSupported);
|
|
21474
|
+
const getReferenceForFileRef = useRef27(getReferenceForFile);
|
|
21475
|
+
const placeholderRef = useRef27(placeholder);
|
|
21476
|
+
const removeMentionLabelRef = useRef27(removeMentionLabel);
|
|
21477
|
+
const availableSkillsRef = useRef27(availableSkills);
|
|
21478
|
+
const availableCapabilitiesRef = useRef27(availableCapabilities);
|
|
21479
|
+
const suppressPastedAtSuggestionRef = useRef27(false);
|
|
21480
|
+
const scrollFrameRef = useRef27(null);
|
|
21320
21481
|
const [contextMenu, setContextMenu] = useState17(null);
|
|
21321
|
-
const closeContextMenu =
|
|
21482
|
+
const closeContextMenu = useCallback37(() => {
|
|
21322
21483
|
setContextMenu(null);
|
|
21323
21484
|
}, []);
|
|
21324
|
-
const insertPlainText =
|
|
21485
|
+
const insertPlainText = useCallback37((text) => {
|
|
21325
21486
|
const currentEditor = editorRef.current;
|
|
21326
21487
|
if (!currentEditor || currentEditor.isDestroyed || !text) {
|
|
21327
21488
|
return;
|
|
@@ -21341,7 +21502,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
|
|
|
21341
21502
|
})
|
|
21342
21503
|
).run();
|
|
21343
21504
|
}, []);
|
|
21344
|
-
const copySelection =
|
|
21505
|
+
const copySelection = useCallback37(async () => {
|
|
21345
21506
|
const currentEditor = editorRef.current;
|
|
21346
21507
|
const selectedText = contextMenu && contextMenu.hasSelection && currentEditor ? readPromptTextRange(
|
|
21347
21508
|
currentEditor,
|
|
@@ -21354,7 +21515,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
|
|
|
21354
21515
|
}
|
|
21355
21516
|
await writePlainTextToClipboard(selectedText);
|
|
21356
21517
|
}, [closeContextMenu, contextMenu]);
|
|
21357
|
-
const cutSelection =
|
|
21518
|
+
const cutSelection = useCallback37(async () => {
|
|
21358
21519
|
const currentEditor = editorRef.current;
|
|
21359
21520
|
const selectionFrom = contextMenu?.selectionFrom ?? null;
|
|
21360
21521
|
const selectionTo = contextMenu?.selectionTo ?? null;
|
|
@@ -21373,7 +21534,7 @@ var AgentRichTextEditor = forwardRef3(function AgentRichTextEditor2({
|
|
|
21373
21534
|
const { from, to } = selectionFrom !== null && selectionTo !== null && selectionFrom < selectionTo ? { from: selectionFrom, to: selectionTo } : currentEditor.state.selection;
|
|
21374
21535
|
currentEditor.chain().focus().deleteRange({ from, to }).run();
|
|
21375
21536
|
}, [closeContextMenu, contextMenu, disabled]);
|
|
21376
|
-
const pasteClipboardText =
|
|
21537
|
+
const pasteClipboardText = useCallback37(async () => {
|
|
21377
21538
|
closeContextMenu();
|
|
21378
21539
|
if (disabled) {
|
|
21379
21540
|
return;
|
|
@@ -21901,7 +22062,7 @@ function AgentReferenceProvenanceFilterControl({
|
|
|
21901
22062
|
}
|
|
21902
22063
|
|
|
21903
22064
|
// agent-gui/agentGuiNode/AgentSlashCommandPalette.tsx
|
|
21904
|
-
import { Fragment as Fragment8, useEffect as useEffect25, useRef as
|
|
22065
|
+
import { Fragment as Fragment8, useEffect as useEffect25, useRef as useRef28 } from "react";
|
|
21905
22066
|
import { Spinner as Spinner3 } from "@tutti-os/ui-system";
|
|
21906
22067
|
import {
|
|
21907
22068
|
Globe,
|
|
@@ -21948,7 +22109,7 @@ function AgentSlashCommandPalette({
|
|
|
21948
22109
|
onSelectSkill
|
|
21949
22110
|
}) {
|
|
21950
22111
|
"use memo";
|
|
21951
|
-
const highlightedOptionRef =
|
|
22112
|
+
const highlightedOptionRef = useRef28(null);
|
|
21952
22113
|
useEffect25(() => {
|
|
21953
22114
|
highlightedOptionRef.current?.scrollIntoView({ block: "nearest" });
|
|
21954
22115
|
}, [highlightedIndex]);
|
|
@@ -22149,7 +22310,7 @@ function slashPaletteEntryIcon(entry) {
|
|
|
22149
22310
|
}
|
|
22150
22311
|
|
|
22151
22312
|
// agent-gui/agentGuiNode/AgentReviewPickerPanel.tsx
|
|
22152
|
-
import { useCallback as
|
|
22313
|
+
import { useCallback as useCallback38, useEffect as useEffect26, useMemo as useMemo27, useRef as useRef29, useState as useState18 } from "react";
|
|
22153
22314
|
import { menuItemClassName } from "@tutti-os/ui-system";
|
|
22154
22315
|
|
|
22155
22316
|
// agent-gui/agentGuiNode/AgentReviewBranchController.ts
|
|
@@ -22267,9 +22428,9 @@ function AgentReviewPickerPanel({
|
|
|
22267
22428
|
const [stage, setStage] = useState18("root");
|
|
22268
22429
|
const [query, setQuery] = useState18("");
|
|
22269
22430
|
const [highlightedIndex, setHighlightedIndex] = useState18(0);
|
|
22270
|
-
const searchInputRef =
|
|
22271
|
-
const highlightedOptionRef =
|
|
22272
|
-
const reviewBranchControllerRef =
|
|
22431
|
+
const searchInputRef = useRef29(null);
|
|
22432
|
+
const highlightedOptionRef = useRef29(null);
|
|
22433
|
+
const reviewBranchControllerRef = useRef29(
|
|
22273
22434
|
null
|
|
22274
22435
|
);
|
|
22275
22436
|
const [branchState, setBranchState] = useState18({
|
|
@@ -22301,18 +22462,18 @@ function AgentReviewPickerPanel({
|
|
|
22301
22462
|
useEffect26(() => {
|
|
22302
22463
|
searchInputRef.current?.focus();
|
|
22303
22464
|
}, [stage]);
|
|
22304
|
-
const submit =
|
|
22465
|
+
const submit = useCallback38(
|
|
22305
22466
|
(command) => {
|
|
22306
22467
|
onSubmitReview(command);
|
|
22307
22468
|
},
|
|
22308
22469
|
[onSubmitReview]
|
|
22309
22470
|
);
|
|
22310
|
-
const goToStage =
|
|
22471
|
+
const goToStage = useCallback38((next) => {
|
|
22311
22472
|
setStage(next);
|
|
22312
22473
|
setQuery("");
|
|
22313
22474
|
setHighlightedIndex(0);
|
|
22314
22475
|
}, []);
|
|
22315
|
-
const goBackToRoot =
|
|
22476
|
+
const goBackToRoot = useCallback38(() => {
|
|
22316
22477
|
setStage("root");
|
|
22317
22478
|
setQuery("");
|
|
22318
22479
|
setHighlightedIndex(0);
|
|
@@ -22400,7 +22561,7 @@ function AgentReviewPickerPanel({
|
|
|
22400
22561
|
emptyMessage = labels.branchEmpty;
|
|
22401
22562
|
}
|
|
22402
22563
|
}
|
|
22403
|
-
const handleKeyDown =
|
|
22564
|
+
const handleKeyDown = useCallback38(
|
|
22404
22565
|
(event) => {
|
|
22405
22566
|
if (event.key === "ArrowDown") {
|
|
22406
22567
|
event.preventDefault();
|
|
@@ -22510,11 +22671,11 @@ function AgentReviewPickerPanel({
|
|
|
22510
22671
|
// agent-gui/agentGuiNode/composerFloatingMenu/ComposerFloatingMenuSurface.tsx
|
|
22511
22672
|
import {
|
|
22512
22673
|
forwardRef as forwardRef4,
|
|
22513
|
-
useCallback as
|
|
22674
|
+
useCallback as useCallback39,
|
|
22514
22675
|
useEffect as useEffect27,
|
|
22515
22676
|
useLayoutEffect as useLayoutEffect5,
|
|
22516
22677
|
useMemo as useMemo28,
|
|
22517
|
-
useRef as
|
|
22678
|
+
useRef as useRef30,
|
|
22518
22679
|
useState as useState19
|
|
22519
22680
|
} from "react";
|
|
22520
22681
|
import { createPortal as createPortal3 } from "react-dom";
|
|
@@ -22608,7 +22769,7 @@ function useComposerAnchoredMenuFrame({
|
|
|
22608
22769
|
open
|
|
22609
22770
|
}) {
|
|
22610
22771
|
const [frame, setFrame] = useState19(null);
|
|
22611
|
-
const syncFrame =
|
|
22772
|
+
const syncFrame = useCallback39(() => {
|
|
22612
22773
|
const anchor = anchorRef.current;
|
|
22613
22774
|
if (!anchor || typeof window === "undefined") {
|
|
22614
22775
|
setFrame(null);
|
|
@@ -22661,13 +22822,13 @@ var ComposerFloatingMenuSurface = forwardRef4(function ComposerFloatingMenuSurfa
|
|
|
22661
22822
|
surfaceRef,
|
|
22662
22823
|
testId
|
|
22663
22824
|
}, forwardedRef) {
|
|
22664
|
-
const localSurfaceRef =
|
|
22825
|
+
const localSurfaceRef = useRef30(null);
|
|
22665
22826
|
const frame = useComposerAnchoredMenuFrame({
|
|
22666
22827
|
anchorRef,
|
|
22667
22828
|
maxHeight,
|
|
22668
22829
|
open
|
|
22669
22830
|
});
|
|
22670
|
-
const setSurfaceRef =
|
|
22831
|
+
const setSurfaceRef = useCallback39(
|
|
22671
22832
|
(node) => {
|
|
22672
22833
|
localSurfaceRef.current = node;
|
|
22673
22834
|
assignRef(surfaceRef, node);
|
|
@@ -22934,10 +23095,10 @@ import {
|
|
|
22934
23095
|
} from "@tutti-os/ui-system";
|
|
22935
23096
|
|
|
22936
23097
|
// app/renderer/assets/icons/add-lined-bold.svg
|
|
22937
|
-
var add_lined_bold_default = "
|
|
23098
|
+
var add_lined_bold_default = 'data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">%0A<path d="M12 1.75C12.6904 1.75 13.25 2.30964 13.25 3V10.75H21C21.6904 10.75 22.25 11.3096 22.25 12C22.25 12.6904 21.6904 13.25 21 13.25H13.25V21C13.25 21.6904 12.6904 22.25 12 22.25C11.3096 22.25 10.75 21.6904 10.75 21V13.25H3C2.30964 13.25 1.75 12.6904 1.75 12C1.75 11.3096 2.30964 10.75 3 10.75H10.75V3C10.75 2.30964 11.3096 1.75 12 1.75Z" fill="black"/>%0A</svg>%0A';
|
|
22938
23099
|
|
|
22939
23100
|
// app/renderer/assets/icons/@-bold-lined.svg
|
|
22940
|
-
var bold_lined_default = "
|
|
23101
|
+
var bold_lined_default = 'data:image/svg+xml,<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">%0A<g clip-path="url(%23clip0_3781_26699)">%0A<path d="M7.23227 1.81049C9.52757 0.736535 12.1185 0.468536 14.5848 1.05073C17.0512 1.63299 19.2485 3.03141 20.8211 5.0185C22.3939 7.00572 23.2498 9.46568 23.2498 11.9999V12.9999C23.2498 14.1271 22.8018 15.2078 22.0047 16.0048C21.2077 16.8018 20.127 17.2499 18.9998 17.2499C17.8727 17.2499 16.792 16.8018 15.995 16.0048C15.8984 15.9082 15.8067 15.8076 15.7206 15.7031C14.7698 16.6583 13.454 17.2499 11.9998 17.2499C9.10043 17.2499 6.74985 14.8994 6.74985 11.9999C6.74988 9.10053 9.10045 6.75003 11.9998 6.74995C13.0401 6.74995 14.0093 7.05327 14.825 7.57514C14.999 7.09414 15.4588 6.75001 15.9998 6.74995C16.6902 6.74995 17.2498 7.30962 17.2498 7.99995V12.9999C17.2498 13.464 17.4344 13.9091 17.7625 14.2372C18.0907 14.5654 18.5358 14.7499 18.9998 14.7499C19.464 14.7499 19.909 14.5654 20.2372 14.2372C20.5653 13.9091 20.7498 13.4641 20.7498 12.9999V11.9999C20.7498 10.029 20.0843 8.11582 18.8612 6.57026C17.638 5.0248 15.9288 3.93724 14.0106 3.48432C12.0923 3.03151 10.0771 3.23983 8.29184 4.07514C6.50657 4.91055 5.05517 6.32388 4.17368 8.08686C3.29224 9.84974 3.03167 11.8587 3.43442 13.788C3.83728 15.7175 4.88014 17.4547 6.3934 18.7177C7.90663 19.9806 9.802 20.6957 11.7723 20.747C13.7427 20.7982 15.673 20.1826 17.2498 18.9999C17.8021 18.5858 18.5856 18.6978 18.9998 19.2499C19.4141 19.8022 19.3021 20.5857 18.7498 20.9999C16.7225 22.5204 14.2412 23.3118 11.7079 23.246C9.17468 23.1802 6.73743 22.2612 4.79184 20.6376C2.8463 19.0139 1.50518 16.7803 0.987154 14.2997C0.469201 11.819 0.804003 9.2354 1.93735 6.9687C3.0707 4.702 4.9369 2.88459 7.23227 1.81049ZM11.9998 9.24994C10.4812 9.25003 9.24988 10.4812 9.24985 11.9999C9.24985 13.5187 10.4811 14.7499 11.9998 14.7499C13.5186 14.7499 14.7498 13.5187 14.7498 11.9999C14.7498 10.4812 13.5186 9.24994 11.9998 9.24994Z" fill="black"/>%0A</g>%0A<defs>%0A<clipPath id="clip0_3781_26699">%0A<rect width="24" height="24" fill="white"/>%0A</clipPath>%0A</defs>%0A</svg>%0A';
|
|
22941
23102
|
|
|
22942
23103
|
// agent-gui/agentGuiNode/composer/ComposerFooter.tsx
|
|
22943
23104
|
import { Fragment as Fragment10, jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
@@ -23545,6 +23706,7 @@ function AgentComposerView(input) {
|
|
|
23545
23706
|
onSubmit: submitInteractivePromptAndDismiss,
|
|
23546
23707
|
labels: {
|
|
23547
23708
|
approvalLead: labels.approvalLead,
|
|
23709
|
+
fileChangeApprovalLead: labels.fileChangeApprovalLead,
|
|
23548
23710
|
planLead: labels.planLead,
|
|
23549
23711
|
planModes: labels.planModes,
|
|
23550
23712
|
stayInPlan: labels.stayInPlan,
|
|
@@ -24069,11 +24231,11 @@ function AgentComposer(props) {
|
|
|
24069
24231
|
const [isSelectedProjectMissing, setIsSelectedProjectMissing] = useState20(false);
|
|
24070
24232
|
const [isSlashStatusPanelOpen, setIsSlashStatusPanelOpen] = useState20(false);
|
|
24071
24233
|
const slashStatusAgentSessionId = slashStatus?.agentSessionId ?? null;
|
|
24072
|
-
const previousSlashStatusAgentSessionIdRef =
|
|
24234
|
+
const previousSlashStatusAgentSessionIdRef = useRef31(
|
|
24073
24235
|
slashStatusAgentSessionId
|
|
24074
24236
|
);
|
|
24075
24237
|
const selectedProjectPath = composerSettings.selectedProjectPath?.trim() ?? "";
|
|
24076
|
-
const previousSelectedProjectPathRef =
|
|
24238
|
+
const previousSelectedProjectPathRef = useRef31(selectedProjectPath);
|
|
24077
24239
|
const [mentionSearchState, setMentionSearchState] = useState20({
|
|
24078
24240
|
status: "idle",
|
|
24079
24241
|
query: "",
|
|
@@ -24083,26 +24245,26 @@ function AgentComposer(props) {
|
|
|
24083
24245
|
groups: [],
|
|
24084
24246
|
error: null
|
|
24085
24247
|
});
|
|
24086
|
-
const composerRef =
|
|
24087
|
-
const inputShellRef =
|
|
24088
|
-
const promptInputAreaRef =
|
|
24089
|
-
const paletteContentRef =
|
|
24090
|
-
const draftPromptRef =
|
|
24091
|
-
const draftImagesRef =
|
|
24092
|
-
const draftFilesRef =
|
|
24093
|
-
const draftLargeTextsRef =
|
|
24094
|
-
const draftByScopeKeyRef =
|
|
24248
|
+
const composerRef = useRef31(null);
|
|
24249
|
+
const inputShellRef = useRef31(null);
|
|
24250
|
+
const promptInputAreaRef = useRef31(null);
|
|
24251
|
+
const paletteContentRef = useRef31(null);
|
|
24252
|
+
const draftPromptRef = useRef31(draftPrompt);
|
|
24253
|
+
const draftImagesRef = useRef31(draftImages);
|
|
24254
|
+
const draftFilesRef = useRef31(draftFiles);
|
|
24255
|
+
const draftLargeTextsRef = useRef31(draftLargeTexts);
|
|
24256
|
+
const draftByScopeKeyRef = useRef31({
|
|
24095
24257
|
[draftScopeKey]: draftContent
|
|
24096
24258
|
});
|
|
24097
24259
|
draftByScopeKeyRef.current[draftScopeKey] = draftContent;
|
|
24098
|
-
const promptTipRef =
|
|
24099
|
-
const mentionControllerRef =
|
|
24260
|
+
const promptTipRef = useRef31(null);
|
|
24261
|
+
const mentionControllerRef = useRef31(
|
|
24100
24262
|
null
|
|
24101
24263
|
);
|
|
24102
|
-
const editorHandleRef =
|
|
24103
|
-
const wasActiveRef =
|
|
24104
|
-
const lastComposerFocusRequestRef =
|
|
24105
|
-
const autoMentionHighlightedKeyRef =
|
|
24264
|
+
const editorHandleRef = useRef31(null);
|
|
24265
|
+
const wasActiveRef = useRef31(isActive);
|
|
24266
|
+
const lastComposerFocusRequestRef = useRef31(null);
|
|
24267
|
+
const autoMentionHighlightedKeyRef = useRef31(null);
|
|
24106
24268
|
const [isPromptTipOverflowing, setIsPromptTipOverflowing] = useState20(false);
|
|
24107
24269
|
const [dockComposerInputHeight, setDockComposerInputHeight] = useState20(
|
|
24108
24270
|
DOCK_COMPOSER_INPUT_MIN_HEIGHT2
|
|
@@ -24822,13 +24984,21 @@ var AgentGUIEmptyHeroCarouselStage = class extends Component3 {
|
|
|
24822
24984
|
);
|
|
24823
24985
|
if (!slot) {
|
|
24824
24986
|
this.layer.style.removeProperty("--agent-gui-hero-carousel-slot-top");
|
|
24987
|
+
this.layer.style.removeProperty("--agent-gui-hero-carousel-slot-left");
|
|
24825
24988
|
return;
|
|
24826
24989
|
}
|
|
24827
|
-
const
|
|
24990
|
+
const stageRect = this.stage.getBoundingClientRect();
|
|
24991
|
+
const slotRect = slot.getBoundingClientRect();
|
|
24992
|
+
const top = slotRect.top - stageRect.top;
|
|
24993
|
+
const left = slotRect.left + slotRect.width / 2 - stageRect.left;
|
|
24828
24994
|
this.layer.style.setProperty(
|
|
24829
24995
|
"--agent-gui-hero-carousel-slot-top",
|
|
24830
24996
|
`${top}px`
|
|
24831
24997
|
);
|
|
24998
|
+
this.layer.style.setProperty(
|
|
24999
|
+
"--agent-gui-hero-carousel-slot-left",
|
|
25000
|
+
`${left}px`
|
|
25001
|
+
);
|
|
24832
25002
|
};
|
|
24833
25003
|
setLayer = (element) => {
|
|
24834
25004
|
this.layer = element;
|
|
@@ -25283,7 +25453,7 @@ function EmptyHeroTitle({
|
|
|
25283
25453
|
|
|
25284
25454
|
// agent-gui/agentGuiNode/view/AgentGUIProviderManagerDialog.tsx
|
|
25285
25455
|
import {
|
|
25286
|
-
useRef as
|
|
25456
|
+
useRef as useRef32,
|
|
25287
25457
|
useState as useState22
|
|
25288
25458
|
} from "react";
|
|
25289
25459
|
import { CircleMinus, CirclePlus } from "lucide-react";
|
|
@@ -25325,12 +25495,12 @@ function AgentGUIProviderManagerDialog({
|
|
|
25325
25495
|
null
|
|
25326
25496
|
);
|
|
25327
25497
|
const [dragPreview, setDragPreview] = useState22(null);
|
|
25328
|
-
const dragStateRef =
|
|
25329
|
-
const dragPreviewRef =
|
|
25498
|
+
const dragStateRef = useRef32(null);
|
|
25499
|
+
const dragPreviewRef = useRef32(null);
|
|
25330
25500
|
const [longPressTargetId, setLongPressTargetId] = useState22(
|
|
25331
25501
|
null
|
|
25332
25502
|
);
|
|
25333
|
-
const longPressOriginRef =
|
|
25503
|
+
const longPressOriginRef = useRef32(null);
|
|
25334
25504
|
const finalAvailableAgent = availableTargets.length === 1;
|
|
25335
25505
|
const showRunningAgentBlocked = (targetId) => {
|
|
25336
25506
|
const target = targets.find((candidate) => candidate.targetId === targetId);
|
|
@@ -25566,7 +25736,7 @@ function AgentGUIProviderManagerDialog({
|
|
|
25566
25736
|
"div",
|
|
25567
25737
|
{
|
|
25568
25738
|
"aria-label": labels.manageAgentsAvailable,
|
|
25569
|
-
className: "grid grid-cols-5 gap-x-3 gap-y-4",
|
|
25739
|
+
className: "grid grid-cols-5 gap-x-3 gap-y-4 rounded-[8px] border border-dashed border-[var(--border-1)] px-3 py-4",
|
|
25570
25740
|
"data-editing": editing ? "true" : "false",
|
|
25571
25741
|
onClick: exitEditingFromBlankSpace,
|
|
25572
25742
|
role: "list",
|
|
@@ -25690,7 +25860,7 @@ function AgentGUIProviderManagerDialog({
|
|
|
25690
25860
|
"div",
|
|
25691
25861
|
{
|
|
25692
25862
|
"aria-label": labels.manageAgentsDisabled,
|
|
25693
|
-
className: "grid grid-cols-5 gap-x-3 gap-y-4",
|
|
25863
|
+
className: "grid grid-cols-5 gap-x-3 gap-y-4 rounded-[8px] border border-dashed border-[var(--border-1)] px-3 py-4",
|
|
25694
25864
|
"data-editing": editing ? "true" : "false",
|
|
25695
25865
|
onClick: exitEditingFromBlankSpace,
|
|
25696
25866
|
role: "list",
|
|
@@ -25787,7 +25957,7 @@ function AgentGUIProviderManagerDialog({
|
|
|
25787
25957
|
}
|
|
25788
25958
|
|
|
25789
25959
|
// agent-gui/agentGuiNode/view/useAgentGUIProviderRailPreferences.ts
|
|
25790
|
-
import { useCallback as
|
|
25960
|
+
import { useCallback as useCallback40, useEffect as useEffect29, useState as useState23 } from "react";
|
|
25791
25961
|
function readAgentGUIProviderRailPreferences(storageKey) {
|
|
25792
25962
|
return parseAgentGUIProviderRailPreferences(
|
|
25793
25963
|
globalThis.localStorage?.getItem(storageKey)
|
|
@@ -25820,7 +25990,7 @@ function useAgentGUIProviderRailPreferences() {
|
|
|
25820
25990
|
);
|
|
25821
25991
|
};
|
|
25822
25992
|
}, [storageKey]);
|
|
25823
|
-
const persistPreferences =
|
|
25993
|
+
const persistPreferences = useCallback40(
|
|
25824
25994
|
(nextPreferences) => {
|
|
25825
25995
|
setPreferences(nextPreferences);
|
|
25826
25996
|
globalThis.localStorage?.setItem(
|
|
@@ -25929,8 +26099,8 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
|
|
|
25929
26099
|
preferences: providerRailPreferences
|
|
25930
26100
|
} = useAgentGUIProviderRailPreferences();
|
|
25931
26101
|
const [dragState, setDragState] = useState24(null);
|
|
25932
|
-
const dragStateRef =
|
|
25933
|
-
const setProviderRailDragState =
|
|
26102
|
+
const dragStateRef = useRef33(null);
|
|
26103
|
+
const setProviderRailDragState = useCallback41(
|
|
25934
26104
|
(nextDragState) => {
|
|
25935
26105
|
dragStateRef.current = nextDragState;
|
|
25936
26106
|
setDragState(nextDragState);
|
|
@@ -25995,7 +26165,7 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
|
|
|
25995
26165
|
);
|
|
25996
26166
|
const selectedAgentTargetIsPlaceholder = selectedAgentTarget?.disabled === true && selectedAgentTarget.targetId === `local:${selectedAgentTarget.provider}`;
|
|
25997
26167
|
const allTileSelected = conversationFilter.kind === "all" && !selectedAgentTargetIsPlaceholder;
|
|
25998
|
-
const selectAllProviders =
|
|
26168
|
+
const selectAllProviders = useCallback41(() => {
|
|
25999
26169
|
onUpdateConversationFilter({ kind: "all" });
|
|
26000
26170
|
if (selectedAgentTargetIsPlaceholder) {
|
|
26001
26171
|
const fallbackTarget = railProviderTargets.find((target) => target.disabled !== true) ?? null;
|
|
@@ -26014,7 +26184,7 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
|
|
|
26014
26184
|
railProviderTargets,
|
|
26015
26185
|
selectedAgentTargetIsPlaceholder
|
|
26016
26186
|
]);
|
|
26017
|
-
const selectAgentTargetTile =
|
|
26187
|
+
const selectAgentTargetTile = useCallback41(
|
|
26018
26188
|
(target) => {
|
|
26019
26189
|
onSelectConversationFilterTarget({
|
|
26020
26190
|
provider: target.provider,
|
|
@@ -26024,10 +26194,10 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
|
|
|
26024
26194
|
},
|
|
26025
26195
|
[onRequestComposerFocus, onSelectConversationFilterTarget]
|
|
26026
26196
|
);
|
|
26027
|
-
const clearProviderRailDragState =
|
|
26197
|
+
const clearProviderRailDragState = useCallback41(() => {
|
|
26028
26198
|
setProviderRailDragState(null);
|
|
26029
26199
|
}, [setProviderRailDragState]);
|
|
26030
|
-
const handleProviderRailDragStart =
|
|
26200
|
+
const handleProviderRailDragStart = useCallback41(
|
|
26031
26201
|
(event, target) => {
|
|
26032
26202
|
if (previewMode || agentTargetsLoading) {
|
|
26033
26203
|
event.preventDefault();
|
|
@@ -26043,7 +26213,7 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
|
|
|
26043
26213
|
},
|
|
26044
26214
|
[previewMode, agentTargetsLoading, setProviderRailDragState]
|
|
26045
26215
|
);
|
|
26046
|
-
const handleProviderRailDragOver =
|
|
26216
|
+
const handleProviderRailDragOver = useCallback41(
|
|
26047
26217
|
(event, target) => {
|
|
26048
26218
|
if (previewMode || agentTargetsLoading || !dragState) {
|
|
26049
26219
|
return;
|
|
@@ -26075,7 +26245,7 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
|
|
|
26075
26245
|
},
|
|
26076
26246
|
[dragState, previewMode, agentTargetsLoading, setProviderRailDragState]
|
|
26077
26247
|
);
|
|
26078
|
-
const commitProviderRailDragDrop =
|
|
26248
|
+
const commitProviderRailDragDrop = useCallback41(
|
|
26079
26249
|
(event) => {
|
|
26080
26250
|
const fallbackDraggedTargetId = event.dataTransfer.getData("text/plain").trim();
|
|
26081
26251
|
const activeDragState = dragStateRef.current ?? dragState ?? (fallbackDraggedTargetId ? {
|
|
@@ -26201,7 +26371,7 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
|
|
|
26201
26371
|
onUpdateConversationFilter({ kind: "all" });
|
|
26202
26372
|
}
|
|
26203
26373
|
};
|
|
26204
|
-
const handleProviderRailContainerDragOver =
|
|
26374
|
+
const handleProviderRailContainerDragOver = useCallback41(
|
|
26205
26375
|
(event) => {
|
|
26206
26376
|
const activeDragState = dragStateRef.current ?? dragState;
|
|
26207
26377
|
if (!activeDragState || previewMode || agentTargetsLoading) {
|
|
@@ -26381,7 +26551,16 @@ var AgentGUIProviderRail = memo4(function AgentGUIProviderRail2({
|
|
|
26381
26551
|
draggable: false,
|
|
26382
26552
|
src: target.badge.iconUrl
|
|
26383
26553
|
}
|
|
26384
|
-
) }) : null
|
|
26554
|
+
) }) : null,
|
|
26555
|
+
providerSelected && isBetaAgentProvider(target.provider) ? /* @__PURE__ */ jsx41(
|
|
26556
|
+
"img",
|
|
26557
|
+
{
|
|
26558
|
+
"aria-hidden": "true",
|
|
26559
|
+
className: AgentGUINode_styles_default.providerRailBetaBadge,
|
|
26560
|
+
src: agent_vinyl_beta_tag_default,
|
|
26561
|
+
alt: ""
|
|
26562
|
+
}
|
|
26563
|
+
) : null
|
|
26385
26564
|
] })
|
|
26386
26565
|
},
|
|
26387
26566
|
`${target.provider}:${target.targetId}`
|
|
@@ -26408,11 +26587,11 @@ import { memo as memo8, useState as useState28 } from "react";
|
|
|
26408
26587
|
import {
|
|
26409
26588
|
Fragment as Fragment13,
|
|
26410
26589
|
memo as memo7,
|
|
26411
|
-
useCallback as
|
|
26590
|
+
useCallback as useCallback44,
|
|
26412
26591
|
useEffect as useEffect30,
|
|
26413
26592
|
useLayoutEffect as useLayoutEffect6,
|
|
26414
26593
|
useMemo as useMemo32,
|
|
26415
|
-
useRef as
|
|
26594
|
+
useRef as useRef35,
|
|
26416
26595
|
useState as useState27
|
|
26417
26596
|
} from "react";
|
|
26418
26597
|
import {
|
|
@@ -26541,6 +26720,70 @@ function AgentConversationListSkeleton({
|
|
|
26541
26720
|
);
|
|
26542
26721
|
}
|
|
26543
26722
|
|
|
26723
|
+
// agent-gui/agentGuiNode/model/agentGuiConversationRailMembershipRefresh.ts
|
|
26724
|
+
function planRuntimeRailMembershipRefresh(input) {
|
|
26725
|
+
const targetId = input.agentTargetId?.trim() ?? "";
|
|
26726
|
+
const visible = (record) => !targetId || record.agentTargetId?.trim() === targetId;
|
|
26727
|
+
const previousPendingIds = new Set(
|
|
26728
|
+
input.previous.filter(
|
|
26729
|
+
(record) => record.projectionSource === "pending_activation" && visible(record)
|
|
26730
|
+
).map((record) => record.id)
|
|
26731
|
+
);
|
|
26732
|
+
const canonical = (records) => new Map(
|
|
26733
|
+
records.filter(
|
|
26734
|
+
(record) => record.projectionSource !== "pending_activation" && visible(record)
|
|
26735
|
+
).map((record) => [record.id, record])
|
|
26736
|
+
);
|
|
26737
|
+
const previousById = canonical(input.previous);
|
|
26738
|
+
const nextById = canonical(input.next);
|
|
26739
|
+
const loadedIds = new Set(
|
|
26740
|
+
(input.loadedSections ?? []).flatMap((section) => section.sessionIds)
|
|
26741
|
+
);
|
|
26742
|
+
const pageIds = /* @__PURE__ */ new Set();
|
|
26743
|
+
const reconcilingSessionIds = [];
|
|
26744
|
+
let refreshSearch = false;
|
|
26745
|
+
const addPage = (record) => {
|
|
26746
|
+
const pageId = record.pinnedAtUnixMs != null ? "pinned" : record.railSectionKey?.trim();
|
|
26747
|
+
if (pageId) pageIds.add(pageId);
|
|
26748
|
+
};
|
|
26749
|
+
for (const [id, previous] of previousById) {
|
|
26750
|
+
const next = nextById.get(id);
|
|
26751
|
+
if (!next) {
|
|
26752
|
+
addPage(previous);
|
|
26753
|
+
refreshSearch ||= Boolean(input.searchActive);
|
|
26754
|
+
continue;
|
|
26755
|
+
}
|
|
26756
|
+
if ((previous.pinnedAtUnixMs ?? 0) !== (next.pinnedAtUnixMs ?? 0) || previous.railSectionKey !== next.railSectionKey) {
|
|
26757
|
+
addPage(previous);
|
|
26758
|
+
addPage(next);
|
|
26759
|
+
}
|
|
26760
|
+
if (previous.title !== next.title) {
|
|
26761
|
+
refreshSearch ||= Boolean(input.searchActive);
|
|
26762
|
+
}
|
|
26763
|
+
}
|
|
26764
|
+
for (const [id, next] of nextById) {
|
|
26765
|
+
if (previousById.has(id)) continue;
|
|
26766
|
+
if (previousPendingIds.has(id)) {
|
|
26767
|
+
if (!loadedIds.has(id)) {
|
|
26768
|
+
addPage(next);
|
|
26769
|
+
reconcilingSessionIds.push(id);
|
|
26770
|
+
}
|
|
26771
|
+
continue;
|
|
26772
|
+
}
|
|
26773
|
+
if (id === (input.activeConversationId?.trim() ?? "") || loadedIds.has(id)) {
|
|
26774
|
+
continue;
|
|
26775
|
+
}
|
|
26776
|
+
addPage(next);
|
|
26777
|
+
refreshSearch ||= Boolean(input.searchActive);
|
|
26778
|
+
}
|
|
26779
|
+
return pageIds.size > 0 || refreshSearch ? {
|
|
26780
|
+
kind: "refresh_pages",
|
|
26781
|
+
pageIds: [...pageIds],
|
|
26782
|
+
reconcilingSessionIds,
|
|
26783
|
+
refreshSearch
|
|
26784
|
+
} : { kind: "none" };
|
|
26785
|
+
}
|
|
26786
|
+
|
|
26544
26787
|
// agent-gui/agentGuiNode/model/agentGuiConversationRail.ts
|
|
26545
26788
|
function isConversationRailInitialLoadPending(input) {
|
|
26546
26789
|
return input.runtimeSectionsEnabled && input.pending && input.sections === null;
|
|
@@ -26817,70 +27060,6 @@ function projectConversationRailSectionsByExactKey(input) {
|
|
|
26817
27060
|
includeEmptySections: input.includeEmptySections
|
|
26818
27061
|
});
|
|
26819
27062
|
}
|
|
26820
|
-
function planRuntimeRailMembershipRefresh(input) {
|
|
26821
|
-
const previousPendingIds = new Set(
|
|
26822
|
-
input.previous.flatMap((conversation) => {
|
|
26823
|
-
const id = conversation.id.trim();
|
|
26824
|
-
return conversation.projectionSource === "pending_activation" && id ? [id] : [];
|
|
26825
|
-
})
|
|
26826
|
-
);
|
|
26827
|
-
const previousConversations = input.previous.filter(
|
|
26828
|
-
(conversation) => conversation.projectionSource !== "pending_activation"
|
|
26829
|
-
);
|
|
26830
|
-
const nextConversations = input.next.filter(
|
|
26831
|
-
(conversation) => conversation.projectionSource !== "pending_activation"
|
|
26832
|
-
);
|
|
26833
|
-
const previousById = new Map(
|
|
26834
|
-
previousConversations.flatMap((conversation) => {
|
|
26835
|
-
const id = conversation.id.trim();
|
|
26836
|
-
return id ? [[id, conversation]] : [];
|
|
26837
|
-
})
|
|
26838
|
-
);
|
|
26839
|
-
const nextById = new Map(
|
|
26840
|
-
nextConversations.flatMap((conversation) => {
|
|
26841
|
-
const id = conversation.id.trim();
|
|
26842
|
-
return id ? [[id, conversation]] : [];
|
|
26843
|
-
})
|
|
26844
|
-
);
|
|
26845
|
-
const loadedIds = new Set(
|
|
26846
|
-
(input.loadedSections ?? []).flatMap(
|
|
26847
|
-
(section) => section.sessionIds.map((id) => id.trim()).filter(Boolean)
|
|
26848
|
-
)
|
|
26849
|
-
);
|
|
26850
|
-
let requiresRefresh = false;
|
|
26851
|
-
const reconcilingSessionIds = [];
|
|
26852
|
-
for (const id of previousById.keys()) {
|
|
26853
|
-
if (!nextById.has(id)) {
|
|
26854
|
-
requiresRefresh = true;
|
|
26855
|
-
}
|
|
26856
|
-
}
|
|
26857
|
-
for (const [id, conversation] of nextById) {
|
|
26858
|
-
const previous = previousById.get(id);
|
|
26859
|
-
if (!previous) {
|
|
26860
|
-
if (previousPendingIds.has(id)) {
|
|
26861
|
-
if (!loadedIds.has(id)) {
|
|
26862
|
-
requiresRefresh = true;
|
|
26863
|
-
reconcilingSessionIds.push(id);
|
|
26864
|
-
}
|
|
26865
|
-
continue;
|
|
26866
|
-
}
|
|
26867
|
-
if (id === (input.activeConversationId?.trim() ?? "")) {
|
|
26868
|
-
continue;
|
|
26869
|
-
}
|
|
26870
|
-
if (!loadedIds.has(id)) {
|
|
26871
|
-
requiresRefresh = true;
|
|
26872
|
-
}
|
|
26873
|
-
continue;
|
|
26874
|
-
}
|
|
26875
|
-
if ((previous.pinnedAtUnixMs ?? 0) !== (conversation.pinnedAtUnixMs ?? 0)) {
|
|
26876
|
-
requiresRefresh = true;
|
|
26877
|
-
}
|
|
26878
|
-
}
|
|
26879
|
-
return requiresRefresh ? {
|
|
26880
|
-
kind: "refresh_first_pages",
|
|
26881
|
-
reconcilingSessionIds
|
|
26882
|
-
} : { kind: "none" };
|
|
26883
|
-
}
|
|
26884
27063
|
function mergeConversationRailSessionIds(base, loaded) {
|
|
26885
27064
|
const ids = new Set(base);
|
|
26886
27065
|
const merged = [...base];
|
|
@@ -27090,7 +27269,7 @@ function preserveConversationRailSectionTemplates(input) {
|
|
|
27090
27269
|
}
|
|
27091
27270
|
|
|
27092
27271
|
// agent-gui/agentGuiNode/view/AgentGUIConversationRailSection.tsx
|
|
27093
|
-
import { memo as memo6, useCallback as
|
|
27272
|
+
import { memo as memo6, useCallback as useCallback43, useState as useState26 } from "react";
|
|
27094
27273
|
import { ChevronRight as ChevronRight2 } from "lucide-react";
|
|
27095
27274
|
import {
|
|
27096
27275
|
DropdownMenu as DropdownMenu4,
|
|
@@ -27112,9 +27291,9 @@ import {
|
|
|
27112
27291
|
// agent-gui/agentGuiNode/view/AgentGUIConversationRailItem.tsx
|
|
27113
27292
|
import {
|
|
27114
27293
|
memo as memo5,
|
|
27115
|
-
useCallback as
|
|
27294
|
+
useCallback as useCallback42,
|
|
27116
27295
|
useMemo as useMemo31,
|
|
27117
|
-
useRef as
|
|
27296
|
+
useRef as useRef34,
|
|
27118
27297
|
useState as useState25
|
|
27119
27298
|
} from "react";
|
|
27120
27299
|
import { ExternalLink as ExternalLink2 } from "lucide-react";
|
|
@@ -27123,11 +27302,8 @@ import {
|
|
|
27123
27302
|
ContextMenuContent,
|
|
27124
27303
|
ContextMenuItem,
|
|
27125
27304
|
ContextMenuTrigger,
|
|
27126
|
-
AgentSessionsIcon,
|
|
27127
27305
|
FileIcon,
|
|
27128
27306
|
IssueIcon,
|
|
27129
|
-
NavAgentsIcon,
|
|
27130
|
-
NavApplicationsLinedIcon,
|
|
27131
27307
|
NewWorkspaceLinedIcon as NewWorkspaceLinedIcon2,
|
|
27132
27308
|
cn as cn5
|
|
27133
27309
|
} from "@tutti-os/ui-system";
|
|
@@ -27327,7 +27503,9 @@ function agentGUIConversationIconUrl(provider, agentTargetId, workspaceId, agent
|
|
|
27327
27503
|
}
|
|
27328
27504
|
function agentGUIConversationRailTitle(item, labels, uiLanguage) {
|
|
27329
27505
|
const title = conversationPlainTitle(item, labels, uiLanguage);
|
|
27330
|
-
return
|
|
27506
|
+
return isAgentGUIConversationTitleIconMentionKind(
|
|
27507
|
+
item.titleLeadingMentionKind
|
|
27508
|
+
) ? title.replace(/^@\s*/, "") : title;
|
|
27331
27509
|
}
|
|
27332
27510
|
var AgentGUIConversationRailItem = memo5(
|
|
27333
27511
|
function AgentGUIConversationRailItem2({
|
|
@@ -27360,18 +27538,18 @@ var AgentGUIConversationRailItem = memo5(
|
|
|
27360
27538
|
workspaceId,
|
|
27361
27539
|
agentTargets
|
|
27362
27540
|
);
|
|
27363
|
-
const setItemElement =
|
|
27541
|
+
const setItemElement = useCallback42(
|
|
27364
27542
|
(element) => {
|
|
27365
27543
|
registerItemElement(item.id, element);
|
|
27366
27544
|
},
|
|
27367
27545
|
[item.id, registerItemElement]
|
|
27368
27546
|
);
|
|
27369
27547
|
const [contextMenuResetKey, setContextMenuResetKey] = useState25(0);
|
|
27370
|
-
const contextMenuRenameRequestedRef =
|
|
27371
|
-
const contextMenuOpenConversationWindowRequestedRef =
|
|
27372
|
-
const contextMenuCopySessionLinkRequestedRef =
|
|
27548
|
+
const contextMenuRenameRequestedRef = useRef34(false);
|
|
27549
|
+
const contextMenuOpenConversationWindowRequestedRef = useRef34(false);
|
|
27550
|
+
const contextMenuCopySessionLinkRequestedRef = useRef34(false);
|
|
27373
27551
|
const agentHostApi = useOptionalAgentHostApi();
|
|
27374
|
-
const handleMouseLeave =
|
|
27552
|
+
const handleMouseLeave = useCallback42(() => {
|
|
27375
27553
|
if (isPendingDeleteConversation && !isRailInteractionLocked()) {
|
|
27376
27554
|
onCancelDeleteConversation();
|
|
27377
27555
|
}
|
|
@@ -27380,18 +27558,18 @@ var AgentGUIConversationRailItem = memo5(
|
|
|
27380
27558
|
isRailInteractionLocked,
|
|
27381
27559
|
onCancelDeleteConversation
|
|
27382
27560
|
]);
|
|
27383
|
-
const handleSelect =
|
|
27561
|
+
const handleSelect = useCallback42(() => {
|
|
27384
27562
|
if (isRailInteractionLocked()) return;
|
|
27385
27563
|
onSelectConversation(item.id);
|
|
27386
27564
|
}, [isRailInteractionLocked, item.id, onSelectConversation]);
|
|
27387
|
-
const handleTogglePinned =
|
|
27565
|
+
const handleTogglePinned = useCallback42(() => {
|
|
27388
27566
|
if (isRailInteractionLocked()) return;
|
|
27389
27567
|
onToggleConversationPinned(item.id, !pinned);
|
|
27390
27568
|
}, [isRailInteractionLocked, item.id, onToggleConversationPinned, pinned]);
|
|
27391
27569
|
const canMarkUnread = Boolean(
|
|
27392
27570
|
!previewMode && !item.hasUnreadCompletion && item.isImported !== true && (item.unreadCompletionKey || item.status === "completed" || item.status === "ready")
|
|
27393
27571
|
);
|
|
27394
|
-
const handleMarkUnread =
|
|
27572
|
+
const handleMarkUnread = useCallback42(() => {
|
|
27395
27573
|
if (!canMarkUnread || isRailInteractionLocked()) {
|
|
27396
27574
|
return;
|
|
27397
27575
|
}
|
|
@@ -27402,19 +27580,19 @@ var AgentGUIConversationRailItem = memo5(
|
|
|
27402
27580
|
item.id,
|
|
27403
27581
|
onMarkConversationUnread
|
|
27404
27582
|
]);
|
|
27405
|
-
const handleOpenConversationWindow =
|
|
27583
|
+
const handleOpenConversationWindow = useCallback42(() => {
|
|
27406
27584
|
if (isRailInteractionLocked()) return;
|
|
27407
27585
|
onOpenConversationWindow?.(item.id);
|
|
27408
27586
|
}, [isRailInteractionLocked, item.id, onOpenConversationWindow]);
|
|
27409
|
-
const handleRequestDelete =
|
|
27587
|
+
const handleRequestDelete = useCallback42(() => {
|
|
27410
27588
|
if (isRailInteractionLocked()) return;
|
|
27411
27589
|
onRequestDeleteConversation(item.id);
|
|
27412
27590
|
}, [isRailInteractionLocked, item.id, onRequestDeleteConversation]);
|
|
27413
|
-
const handleRequestRename =
|
|
27591
|
+
const handleRequestRename = useCallback42(() => {
|
|
27414
27592
|
if (isRailInteractionLocked()) return;
|
|
27415
27593
|
onRequestRenameConversation(item);
|
|
27416
27594
|
}, [isRailInteractionLocked, item, onRequestRenameConversation]);
|
|
27417
|
-
const handleContextMenuRename =
|
|
27595
|
+
const handleContextMenuRename = useCallback42(() => {
|
|
27418
27596
|
if (isRailInteractionLocked() || contextMenuRenameRequestedRef.current) {
|
|
27419
27597
|
return;
|
|
27420
27598
|
}
|
|
@@ -27429,7 +27607,7 @@ var AgentGUIConversationRailItem = memo5(
|
|
|
27429
27607
|
contextMenuRenameRequestedRef.current = false;
|
|
27430
27608
|
}, 0);
|
|
27431
27609
|
}, [handleRequestRename, isRailInteractionLocked]);
|
|
27432
|
-
const handleContextMenuOpenConversationWindow =
|
|
27610
|
+
const handleContextMenuOpenConversationWindow = useCallback42(() => {
|
|
27433
27611
|
if (isRailInteractionLocked() || contextMenuOpenConversationWindowRequestedRef.current) {
|
|
27434
27612
|
return;
|
|
27435
27613
|
}
|
|
@@ -27444,7 +27622,7 @@ var AgentGUIConversationRailItem = memo5(
|
|
|
27444
27622
|
contextMenuOpenConversationWindowRequestedRef.current = false;
|
|
27445
27623
|
}, 0);
|
|
27446
27624
|
}, [handleOpenConversationWindow, isRailInteractionLocked]);
|
|
27447
|
-
const handleContextMenuCopySessionLink =
|
|
27625
|
+
const handleContextMenuCopySessionLink = useCallback42(() => {
|
|
27448
27626
|
if (isRailInteractionLocked() || contextMenuCopySessionLinkRequestedRef.current) {
|
|
27449
27627
|
return;
|
|
27450
27628
|
}
|
|
@@ -27518,7 +27696,9 @@ var AgentGUIConversationRailItem = memo5(
|
|
|
27518
27696
|
}
|
|
27519
27697
|
}
|
|
27520
27698
|
) : null,
|
|
27521
|
-
|
|
27699
|
+
isAgentGUIConversationTitleIconMentionKind(
|
|
27700
|
+
item.titleLeadingMentionKind
|
|
27701
|
+
) ? /* @__PURE__ */ jsx47(
|
|
27522
27702
|
"span",
|
|
27523
27703
|
{
|
|
27524
27704
|
"aria-hidden": "true",
|
|
@@ -27690,10 +27870,7 @@ function ConversationTitleMentionIcon({
|
|
|
27690
27870
|
kind
|
|
27691
27871
|
}) {
|
|
27692
27872
|
if (kind === "task") return /* @__PURE__ */ jsx47(IssueIcon, {});
|
|
27693
|
-
|
|
27694
|
-
if (kind === "file") return /* @__PURE__ */ jsx47(FileIcon, {});
|
|
27695
|
-
if (kind === "agent") return /* @__PURE__ */ jsx47(NavAgentsIcon, {});
|
|
27696
|
-
return /* @__PURE__ */ jsx47(AgentSessionsIcon, {});
|
|
27873
|
+
return /* @__PURE__ */ jsx47(FileIcon, {});
|
|
27697
27874
|
}
|
|
27698
27875
|
function AgentGUIProjectRailHeader({
|
|
27699
27876
|
disabled,
|
|
@@ -27859,7 +28036,7 @@ var AgentGUIConversationRailSection = memo6(
|
|
|
27859
28036
|
const visibleCountTowardTotal = visiblePageableIds.size + (activeConversationCountsTowardTotal && activeConversation && visibleItems.some((item) => item.id === activeConversation.id) && !visiblePageableIds.has(activeConversation.id) ? 1 : 0);
|
|
27860
28037
|
const canShowMore = !isSectionCollapsed && visibleCountTowardTotal < sectionTotalCount && (visibleItemCount < pageableItems.length || sectionHasMore);
|
|
27861
28038
|
const canShowLess = !isSectionCollapsed && visibleItemCount > AGENT_GUI_CONVERSATION_RAIL_SECTION_PAGE_SIZE;
|
|
27862
|
-
const showMoreConversations =
|
|
28039
|
+
const showMoreConversations = useCallback43(() => {
|
|
27863
28040
|
if (isRailInteractionLocked()) return;
|
|
27864
28041
|
if (visibleItemCount >= pageableItems.length && sectionHasMore) {
|
|
27865
28042
|
onLoadMoreConversations(section);
|
|
@@ -27885,7 +28062,7 @@ var AgentGUIConversationRailSection = memo6(
|
|
|
27885
28062
|
sectionHasMore,
|
|
27886
28063
|
visibleItemCount
|
|
27887
28064
|
]);
|
|
27888
|
-
const showLessConversations =
|
|
28065
|
+
const showLessConversations = useCallback43(() => {
|
|
27889
28066
|
if (isRailInteractionLocked()) return;
|
|
27890
28067
|
setVisibleItemLimitState({
|
|
27891
28068
|
limit: AGENT_GUI_CONVERSATION_RAIL_SECTION_PAGE_SIZE,
|
|
@@ -27894,7 +28071,7 @@ var AgentGUIConversationRailSection = memo6(
|
|
|
27894
28071
|
}, [isRailInteractionLocked, paginationScopeKey]);
|
|
27895
28072
|
const canCreateConversationFromSection = section.kind === "conversations" || Boolean(projectPath);
|
|
27896
28073
|
const createConversationLabel = projectPath ? labels.projectSectionEdit : labels.newConversation;
|
|
27897
|
-
const handleCreateConversation =
|
|
28074
|
+
const handleCreateConversation = useCallback43(() => {
|
|
27898
28075
|
if (isRailInteractionLocked()) return;
|
|
27899
28076
|
if (projectPath) {
|
|
27900
28077
|
onCreateConversation({ projectPath, source: "project_section" });
|
|
@@ -28277,15 +28454,15 @@ var AgentGUIConversationRailPane = memo7(
|
|
|
28277
28454
|
const [pendingProjectAction, setPendingProjectAction] = useState27(null);
|
|
28278
28455
|
const [isRequestingBatchDeletion, setIsRequestingBatchDeletion] = useState27(false);
|
|
28279
28456
|
const { railSearch } = railQuery;
|
|
28280
|
-
const railElementRef =
|
|
28281
|
-
const conversationListRef =
|
|
28282
|
-
const conversationItemElementsRef =
|
|
28457
|
+
const railElementRef = useRef35(null);
|
|
28458
|
+
const conversationListRef = useRef35(null);
|
|
28459
|
+
const conversationItemElementsRef = useRef35(
|
|
28283
28460
|
/* @__PURE__ */ new Map()
|
|
28284
28461
|
);
|
|
28285
|
-
const activeConversationScrollCompletedRef =
|
|
28286
|
-
const previousActiveConversationIdRef =
|
|
28287
|
-
const railActiveConversationRef =
|
|
28288
|
-
const groupedConversationsRef =
|
|
28462
|
+
const activeConversationScrollCompletedRef = useRef35(null);
|
|
28463
|
+
const previousActiveConversationIdRef = useRef35(null);
|
|
28464
|
+
const railActiveConversationRef = useRef35([]);
|
|
28465
|
+
const groupedConversationsRef = useRef35(null);
|
|
28289
28466
|
const {
|
|
28290
28467
|
loadMoreSectionConversations,
|
|
28291
28468
|
isInteractionLocked,
|
|
@@ -28439,7 +28616,7 @@ var AgentGUIConversationRailPane = memo7(
|
|
|
28439
28616
|
]);
|
|
28440
28617
|
const groupedConversations = groupedConversationResult.groups;
|
|
28441
28618
|
const sectionPaginationScopeKey = `${conversationFilter.kind === "agentTarget" ? `${workspaceId}:agentTarget:${conversationFilter.agentTargetId.trim()}` : `${workspaceId}:all:${sectionAgentTargetFallbackId?.trim() ?? ""}`}:search:${conversationQuery.trim()}`;
|
|
28442
|
-
const toggleProjectSectionCollapsed =
|
|
28619
|
+
const toggleProjectSectionCollapsed = useCallback44((sectionId) => {
|
|
28443
28620
|
setCollapsedProjectSectionIds((current) => {
|
|
28444
28621
|
const next = new Set(current);
|
|
28445
28622
|
if (next.has(sectionId)) {
|
|
@@ -28457,7 +28634,7 @@ var AgentGUIConversationRailPane = memo7(
|
|
|
28457
28634
|
[groupedConversations, railActiveOverlay]
|
|
28458
28635
|
);
|
|
28459
28636
|
const sectionAgentTargetId = conversationFilter.kind === "agentTarget" ? conversationFilter.agentTargetId.trim() : sectionAgentTargetFallbackId?.trim() ?? "";
|
|
28460
|
-
const requestSectionBatchDeletion =
|
|
28637
|
+
const requestSectionBatchDeletion = useCallback44(
|
|
28461
28638
|
(section) => {
|
|
28462
28639
|
if (isInteractionLocked() || isDeletingProjectConversations || isRequestingBatchDeletion) {
|
|
28463
28640
|
return;
|
|
@@ -28498,7 +28675,7 @@ var AgentGUIConversationRailPane = memo7(
|
|
|
28498
28675
|
);
|
|
28499
28676
|
const shouldShowConversationEmptyState = !isConversationRailListLoading && groupedConversations.length === 0;
|
|
28500
28677
|
const shouldShowConversationSearchError = backendSearchActive && railSearch.failed && railSearch.sessionIds.length === 0;
|
|
28501
|
-
const registerConversationItemElement =
|
|
28678
|
+
const registerConversationItemElement = useCallback44(
|
|
28502
28679
|
(itemId, element) => {
|
|
28503
28680
|
if (element) {
|
|
28504
28681
|
conversationItemElementsRef.current.set(itemId, element);
|
|
@@ -28727,16 +28904,77 @@ var AgentGUIConversationRailPane = memo7(
|
|
|
28727
28904
|
import {
|
|
28728
28905
|
selectWorkspaceAgentConsumerSessions as selectWorkspaceAgentConsumerSessions4
|
|
28729
28906
|
} from "@tutti-os/agent-activity-core";
|
|
28730
|
-
import { useEffect as useEffect31, useMemo as useMemo33, useRef as
|
|
28731
|
-
|
|
28732
|
-
// agent-gui/agentGuiNode/controller/AgentGUIConversationRailQueryController.ts
|
|
28733
|
-
import {
|
|
28734
|
-
selectPendingActivations as selectPendingActivations3,
|
|
28735
|
-
selectWorkspaceAgentConsumerSessions as selectWorkspaceAgentConsumerSessions3
|
|
28736
|
-
} from "@tutti-os/agent-activity-core";
|
|
28907
|
+
import { useEffect as useEffect31, useMemo as useMemo33, useRef as useRef36 } from "react";
|
|
28737
28908
|
|
|
28738
28909
|
// agent-gui/agentGuiNode/controller/agentGuiConversationRailDiagnostics.ts
|
|
28739
28910
|
var CONVERSATION_RAIL_SLOW_DIAGNOSTIC_THRESHOLD_MS = 250;
|
|
28911
|
+
var ConversationRailProviderSwitchDiagnosticTracker = class {
|
|
28912
|
+
constructor(diagnosticLogger, now, workspaceId) {
|
|
28913
|
+
this.diagnosticLogger = diagnosticLogger;
|
|
28914
|
+
this.now = now;
|
|
28915
|
+
this.workspaceId = workspaceId;
|
|
28916
|
+
}
|
|
28917
|
+
diagnosticLogger;
|
|
28918
|
+
now;
|
|
28919
|
+
workspaceId;
|
|
28920
|
+
pending = null;
|
|
28921
|
+
configure(input) {
|
|
28922
|
+
if (input.nextScopeKey !== input.previousScopeKey && this.pending?.scopeKey !== input.nextScopeKey) {
|
|
28923
|
+
this.pending = null;
|
|
28924
|
+
}
|
|
28925
|
+
if (input.attached && input.nextScopeKey !== input.previousScopeKey && input.previousScopeKey !== null && input.previousAgentTargetId !== input.nextAgentTargetId) {
|
|
28926
|
+
this.pending = {
|
|
28927
|
+
cacheStatus: "miss",
|
|
28928
|
+
fromAgentTargetId: input.previousAgentTargetId || null,
|
|
28929
|
+
scopeKey: input.nextScopeKey,
|
|
28930
|
+
startedAtMs: this.now(),
|
|
28931
|
+
toAgentTargetId: input.nextAgentTargetId || null
|
|
28932
|
+
};
|
|
28933
|
+
}
|
|
28934
|
+
}
|
|
28935
|
+
hasPending(scopeKey) {
|
|
28936
|
+
return this.pending?.scopeKey === scopeKey;
|
|
28937
|
+
}
|
|
28938
|
+
setCacheStatus(scopeKey, cacheStatus) {
|
|
28939
|
+
if (this.pending?.scopeKey === scopeKey) {
|
|
28940
|
+
this.pending.cacheStatus = cacheStatus;
|
|
28941
|
+
}
|
|
28942
|
+
}
|
|
28943
|
+
complete(scopeKey, result) {
|
|
28944
|
+
const pending = this.pending;
|
|
28945
|
+
if (!pending || pending.scopeKey !== scopeKey) return;
|
|
28946
|
+
this.pending = null;
|
|
28947
|
+
emitConversationRailProviderSwitchDiagnostic({
|
|
28948
|
+
...result,
|
|
28949
|
+
diagnosticLogger: this.diagnosticLogger,
|
|
28950
|
+
durationMs: Math.max(0, this.now() - pending.startedAtMs),
|
|
28951
|
+
fromAgentTargetId: pending.fromAgentTargetId,
|
|
28952
|
+
toAgentTargetId: pending.toAgentTargetId,
|
|
28953
|
+
workspaceId: this.workspaceId
|
|
28954
|
+
});
|
|
28955
|
+
}
|
|
28956
|
+
};
|
|
28957
|
+
function emitConversationRailProviderSwitchDiagnostic(input) {
|
|
28958
|
+
const payload = {
|
|
28959
|
+
cacheStatus: input.cacheStatus,
|
|
28960
|
+
controllerApplyMs: input.controllerApplyMs,
|
|
28961
|
+
durationMs: input.durationMs,
|
|
28962
|
+
...input.status === "error" ? { errorKind: conversationRailErrorKind(input.error) } : {},
|
|
28963
|
+
event: input.status === "error" ? "agent_gui.provider_switch.failed" : "agent_gui.provider_switch.completed",
|
|
28964
|
+
fromAgentTargetId: input.fromAgentTargetId,
|
|
28965
|
+
requestMs: input.requestMs,
|
|
28966
|
+
returnedSessionCount: input.returnedSessionCount,
|
|
28967
|
+
sectionCount: input.sectionCount,
|
|
28968
|
+
status: input.status,
|
|
28969
|
+
toAgentTargetId: input.toAgentTargetId,
|
|
28970
|
+
workspaceId: input.workspaceId
|
|
28971
|
+
};
|
|
28972
|
+
try {
|
|
28973
|
+
input.diagnosticLogger(payload);
|
|
28974
|
+
} catch (error) {
|
|
28975
|
+
ignoreConversationRailDiagnosticFailure(error);
|
|
28976
|
+
}
|
|
28977
|
+
}
|
|
28740
28978
|
function emitConversationRailFirstPagesDiagnostic(input) {
|
|
28741
28979
|
if (input.status === "ready" && input.durationMs < input.diagnosticSlowThresholdMs) {
|
|
28742
28980
|
return;
|
|
@@ -28793,11 +29031,163 @@ function conversationRailErrorKind(error) {
|
|
|
28793
29031
|
return error === null ? "null" : typeof error;
|
|
28794
29032
|
}
|
|
28795
29033
|
|
|
28796
|
-
// agent-gui/agentGuiNode/
|
|
28797
|
-
|
|
28798
|
-
|
|
28799
|
-
|
|
28800
|
-
|
|
29034
|
+
// agent-gui/agentGuiNode/model/agentGuiConversationRailMembershipRecords.ts
|
|
29035
|
+
import {
|
|
29036
|
+
isPendingActivationViable as isPendingActivationViable6,
|
|
29037
|
+
selectPendingActivations as selectPendingActivations3,
|
|
29038
|
+
selectWorkspaceAgentConsumerSessions as selectWorkspaceAgentConsumerSessions3
|
|
29039
|
+
} from "@tutti-os/agent-activity-core";
|
|
29040
|
+
function projectConversationRailMembershipRecords(state) {
|
|
29041
|
+
const sessions = selectWorkspaceAgentConsumerSessions3(state);
|
|
29042
|
+
const canonicalIds = new Set(
|
|
29043
|
+
sessions.map((item) => item.session.agentSessionId)
|
|
29044
|
+
);
|
|
29045
|
+
return [
|
|
29046
|
+
...sessions.map((item) => ({
|
|
29047
|
+
agentTargetId: item.session.agentTargetId,
|
|
29048
|
+
id: item.session.agentSessionId,
|
|
29049
|
+
pinnedAtUnixMs: item.session.pinnedAtUnixMs ?? null,
|
|
29050
|
+
railSectionKey: item.session.railSectionKey?.trim() || null,
|
|
29051
|
+
title: item.session.title
|
|
29052
|
+
})),
|
|
29053
|
+
...selectPendingActivations3(state).filter(
|
|
29054
|
+
(record) => record.mode === "new" && isPendingActivationViable6(record) && !canonicalIds.has(record.agentSessionId)
|
|
29055
|
+
).map((record) => ({
|
|
29056
|
+
agentTargetId: record.agentTargetId,
|
|
29057
|
+
id: record.agentSessionId,
|
|
29058
|
+
pinnedAtUnixMs: null,
|
|
29059
|
+
projectionSource: "pending_activation",
|
|
29060
|
+
railSectionKey: null,
|
|
29061
|
+
title: record.title ?? ""
|
|
29062
|
+
}))
|
|
29063
|
+
];
|
|
29064
|
+
}
|
|
29065
|
+
|
|
29066
|
+
// agent-gui/agentGuiNode/controller/agentGuiConversationRailQueryCache.ts
|
|
29067
|
+
function cachedConversationRailQueryFromFirstPages(page, scopeKey) {
|
|
29068
|
+
const sections = projectRuntimeSectionsToConversationRailMemberships({
|
|
29069
|
+
pinned: page.pinned,
|
|
29070
|
+
sections: page.sections
|
|
29071
|
+
});
|
|
29072
|
+
const sectionPageStates = /* @__PURE__ */ new Map();
|
|
29073
|
+
if (page.pinned) {
|
|
29074
|
+
sectionPageStates.set("pinned", conversationRailPageState(page.pinned));
|
|
29075
|
+
}
|
|
29076
|
+
for (const section of page.sections) {
|
|
29077
|
+
sectionPageStates.set(
|
|
29078
|
+
section.sectionKey,
|
|
29079
|
+
conversationRailPageState(section)
|
|
29080
|
+
);
|
|
29081
|
+
}
|
|
29082
|
+
const sessions = [
|
|
29083
|
+
...page.pinned?.sessions ?? [],
|
|
29084
|
+
...page.sections.flatMap((section) => section.sessions)
|
|
29085
|
+
];
|
|
29086
|
+
return {
|
|
29087
|
+
queryState: {
|
|
29088
|
+
pending: false,
|
|
29089
|
+
reconcilingSessionIds: [],
|
|
29090
|
+
resolvedScopeKey: scopeKey,
|
|
29091
|
+
sectionPageStates,
|
|
29092
|
+
sections
|
|
29093
|
+
},
|
|
29094
|
+
returnedSessionCount: sessions.length,
|
|
29095
|
+
sectionCount: page.sections.length + (page.pinned ? 1 : 0),
|
|
29096
|
+
sessions
|
|
29097
|
+
};
|
|
29098
|
+
}
|
|
29099
|
+
function applyCachedConversationRailQuery(input) {
|
|
29100
|
+
if (input.cache.claimIngestion(input.scopeKey, input.entry.version)) {
|
|
29101
|
+
input.upsertSessions(input.entry.value.sessions);
|
|
29102
|
+
}
|
|
29103
|
+
return input.entry.value.queryState;
|
|
29104
|
+
}
|
|
29105
|
+
function writeConversationRailQueryCache(input) {
|
|
29106
|
+
const { queryState, scopeKey } = input;
|
|
29107
|
+
if (!scopeKey || queryState.pending || queryState.resolvedScopeKey !== scopeKey || queryState.sections === null) {
|
|
29108
|
+
return;
|
|
29109
|
+
}
|
|
29110
|
+
input.cache.write(scopeKey, {
|
|
29111
|
+
queryState,
|
|
29112
|
+
returnedSessionCount: queryState.sections.reduce(
|
|
29113
|
+
(count, section) => count + section.sessionIds.length,
|
|
29114
|
+
0
|
|
29115
|
+
),
|
|
29116
|
+
sectionCount: queryState.sections.length,
|
|
29117
|
+
sessions: []
|
|
29118
|
+
});
|
|
29119
|
+
}
|
|
29120
|
+
function replaceConversationRailFirstPages(input) {
|
|
29121
|
+
let sections = [...input.queryState.sections ?? []];
|
|
29122
|
+
let sectionPageStates = input.queryState.sectionPageStates;
|
|
29123
|
+
for (const refreshed of input.pages) {
|
|
29124
|
+
const sectionId = refreshed.kind === "pinned" ? "pinned" : refreshed.id;
|
|
29125
|
+
sectionPageStates = updateConversationRailSectionPageState(
|
|
29126
|
+
sectionPageStates,
|
|
29127
|
+
sectionId,
|
|
29128
|
+
conversationRailPageState(refreshed.page)
|
|
29129
|
+
);
|
|
29130
|
+
const projected = refreshed.kind === "pinned" ? projectRuntimeSectionsToConversationRailMemberships({
|
|
29131
|
+
pinned: refreshed.page,
|
|
29132
|
+
sections: []
|
|
29133
|
+
})[0] : projectRuntimeSectionsToConversationRailMemberships({
|
|
29134
|
+
sections: [refreshed.page]
|
|
29135
|
+
})[0];
|
|
29136
|
+
const existingIndex = sections.findIndex(
|
|
29137
|
+
(section) => section.id === sectionId
|
|
29138
|
+
);
|
|
29139
|
+
if (!projected) {
|
|
29140
|
+
if (existingIndex >= 0) sections.splice(existingIndex, 1);
|
|
29141
|
+
continue;
|
|
29142
|
+
}
|
|
29143
|
+
if (existingIndex >= 0) {
|
|
29144
|
+
sections[existingIndex] = projected;
|
|
29145
|
+
continue;
|
|
29146
|
+
}
|
|
29147
|
+
if (projected.kind === "pinned") {
|
|
29148
|
+
sections.unshift(projected);
|
|
29149
|
+
continue;
|
|
29150
|
+
}
|
|
29151
|
+
const conversationsIndex = sections.findIndex(
|
|
29152
|
+
(section) => section.kind === "conversations"
|
|
29153
|
+
);
|
|
29154
|
+
if (projected.kind === "project" && conversationsIndex >= 0) {
|
|
29155
|
+
sections.splice(conversationsIndex, 0, projected);
|
|
29156
|
+
} else {
|
|
29157
|
+
sections.push(projected);
|
|
29158
|
+
}
|
|
29159
|
+
}
|
|
29160
|
+
return {
|
|
29161
|
+
...input.queryState,
|
|
29162
|
+
pending: false,
|
|
29163
|
+
reconcilingSessionIds: [],
|
|
29164
|
+
sectionPageStates,
|
|
29165
|
+
sections
|
|
29166
|
+
};
|
|
29167
|
+
}
|
|
29168
|
+
function updateConversationRailSectionPageState(current, sectionId, value) {
|
|
29169
|
+
const next = new Map(current);
|
|
29170
|
+
next.set(sectionId, value);
|
|
29171
|
+
return next;
|
|
29172
|
+
}
|
|
29173
|
+
function conversationRailPageState(page) {
|
|
29174
|
+
return {
|
|
29175
|
+
hasMore: page.hasMore,
|
|
29176
|
+
isLoading: false,
|
|
29177
|
+
nextCursor: page.nextCursor ?? null,
|
|
29178
|
+
totalCount: page.totalCount
|
|
29179
|
+
};
|
|
29180
|
+
}
|
|
29181
|
+
|
|
29182
|
+
// agent-gui/agentGuiNode/controller/agentGuiConversationRailQuerySnapshot.ts
|
|
29183
|
+
var EMPTY_CONVERSATION_RAIL_QUERY_STATE = {
|
|
29184
|
+
pending: false,
|
|
29185
|
+
reconcilingSessionIds: [],
|
|
29186
|
+
resolvedScopeKey: null,
|
|
29187
|
+
sectionPageStates: /* @__PURE__ */ new Map(),
|
|
29188
|
+
sections: null
|
|
29189
|
+
};
|
|
29190
|
+
var EMPTY_CONVERSATION_SEARCH_QUERY_STATE = {
|
|
28801
29191
|
failed: false,
|
|
28802
29192
|
hasMore: false,
|
|
28803
29193
|
loadingMore: false,
|
|
@@ -28807,13 +29197,109 @@ var EMPTY_SEARCH_STATE = {
|
|
|
28807
29197
|
resolvedQuery: "",
|
|
28808
29198
|
sessionIds: []
|
|
28809
29199
|
};
|
|
28810
|
-
|
|
28811
|
-
|
|
28812
|
-
|
|
28813
|
-
|
|
28814
|
-
|
|
28815
|
-
|
|
29200
|
+
function buildConversationRailQuerySnapshot(input) {
|
|
29201
|
+
const searchResolved = input.searchState.requestKey === input.searchRequestKey && input.searchState.resolvedQuery === input.searchQuery;
|
|
29202
|
+
return {
|
|
29203
|
+
railSearch: {
|
|
29204
|
+
enabled: input.searchEnabled,
|
|
29205
|
+
failed: searchResolved && input.searchState.failed,
|
|
29206
|
+
hasMore: searchResolved && input.searchState.hasMore,
|
|
29207
|
+
loadingMore: searchResolved && input.searchState.loadingMore,
|
|
29208
|
+
pending: Boolean(input.searchQuery) && (!searchResolved || input.searchState.pending),
|
|
29209
|
+
resolvedQuery: searchResolved ? input.searchState.resolvedQuery : "",
|
|
29210
|
+
sessionIds: searchResolved ? input.searchState.sessionIds : []
|
|
29211
|
+
},
|
|
29212
|
+
runtimeSectionsEnabled: input.runtimeSectionsEnabled,
|
|
29213
|
+
runtimeRailMemberships: input.queryState.sections,
|
|
29214
|
+
runtimeRailReconcilingSessionIds: input.queryState.reconcilingSessionIds,
|
|
29215
|
+
runtimeRailSectionsPending: input.queryState.pending,
|
|
29216
|
+
sectionPageStates: input.queryState.sectionPageStates
|
|
29217
|
+
};
|
|
29218
|
+
}
|
|
29219
|
+
|
|
29220
|
+
// agent-gui/agentGuiNode/controller/AgentGUIConversationRailTargetedPageRefresher.ts
|
|
29221
|
+
var SECTION_PAGE_SIZE = 5;
|
|
29222
|
+
var AgentGUIConversationRailTargetedPageRefresher = class {
|
|
29223
|
+
constructor(input) {
|
|
29224
|
+
this.input = input;
|
|
29225
|
+
}
|
|
29226
|
+
input;
|
|
29227
|
+
abortController = null;
|
|
29228
|
+
pendingPageIds = /* @__PURE__ */ new Set();
|
|
29229
|
+
requestSequence = 0;
|
|
29230
|
+
refresh(input) {
|
|
29231
|
+
for (const pageId of input.pageIds) this.pendingPageIds.add(pageId);
|
|
29232
|
+
if (this.pendingPageIds.size === 0) return;
|
|
29233
|
+
this.abortController?.abort();
|
|
29234
|
+
const abortController = new AbortController();
|
|
29235
|
+
this.abortController = abortController;
|
|
29236
|
+
const requestSequence = ++this.requestSequence;
|
|
29237
|
+
const pageIds = [...this.pendingPageIds];
|
|
29238
|
+
const requests = pageIds.flatMap((id) => {
|
|
29239
|
+
if (id === "pinned") {
|
|
29240
|
+
const listPage2 = this.input.runtime.listPinnedSessionsPage;
|
|
29241
|
+
return listPage2 ? [
|
|
29242
|
+
listPage2({
|
|
29243
|
+
agentTargetId: input.agentTargetId || void 0,
|
|
29244
|
+
limit: SECTION_PAGE_SIZE,
|
|
29245
|
+
signal: abortController.signal,
|
|
29246
|
+
workspaceId: this.input.workspaceId
|
|
29247
|
+
}).then(
|
|
29248
|
+
(page) => ({
|
|
29249
|
+
kind: "pinned",
|
|
29250
|
+
page
|
|
29251
|
+
})
|
|
29252
|
+
)
|
|
29253
|
+
] : [];
|
|
29254
|
+
}
|
|
29255
|
+
const listPage = this.input.runtime.listSessionSectionPage;
|
|
29256
|
+
return listPage ? [
|
|
29257
|
+
listPage({
|
|
29258
|
+
agentTargetId: input.agentTargetId || void 0,
|
|
29259
|
+
limit: SECTION_PAGE_SIZE,
|
|
29260
|
+
sectionKey: id,
|
|
29261
|
+
signal: abortController.signal,
|
|
29262
|
+
workspaceId: this.input.workspaceId
|
|
29263
|
+
}).then(
|
|
29264
|
+
(page) => ({
|
|
29265
|
+
id,
|
|
29266
|
+
kind: "section",
|
|
29267
|
+
page
|
|
29268
|
+
})
|
|
29269
|
+
)
|
|
29270
|
+
] : [];
|
|
29271
|
+
});
|
|
29272
|
+
if (requests.length !== pageIds.length) {
|
|
29273
|
+
for (const id of pageIds) this.pendingPageIds.delete(id);
|
|
29274
|
+
this.input.onFailed?.();
|
|
29275
|
+
return;
|
|
29276
|
+
}
|
|
29277
|
+
void Promise.all(requests).then((pages) => {
|
|
29278
|
+
if (abortController.signal.aborted || requestSequence !== this.requestSequence) {
|
|
29279
|
+
return;
|
|
29280
|
+
}
|
|
29281
|
+
for (const id of pageIds) this.pendingPageIds.delete(id);
|
|
29282
|
+
this.input.onResolved(pages);
|
|
29283
|
+
}).catch(() => {
|
|
29284
|
+
if (abortController.signal.aborted || requestSequence !== this.requestSequence) {
|
|
29285
|
+
return;
|
|
29286
|
+
}
|
|
29287
|
+
for (const id of pageIds) this.pendingPageIds.delete(id);
|
|
29288
|
+
this.input.onFailed?.();
|
|
29289
|
+
});
|
|
29290
|
+
}
|
|
29291
|
+
cancel() {
|
|
29292
|
+
this.requestSequence += 1;
|
|
29293
|
+
this.abortController?.abort();
|
|
29294
|
+
this.abortController = null;
|
|
29295
|
+
this.pendingPageIds.clear();
|
|
29296
|
+
}
|
|
28816
29297
|
};
|
|
29298
|
+
|
|
29299
|
+
// agent-gui/agentGuiNode/controller/AgentGUIConversationRailQueryController.ts
|
|
29300
|
+
var SECTION_PAGE_SIZE2 = 5;
|
|
29301
|
+
var CONVERSATION_SEARCH_DEBOUNCE_MS = 300;
|
|
29302
|
+
var CONVERSATION_RAIL_QUERY_CACHE_FRESH_MS = 3e4;
|
|
28817
29303
|
var AgentGUIConversationRailQueryController = class {
|
|
28818
29304
|
getSnapshot = () => this.snapshot;
|
|
28819
29305
|
isInteractionLocked = () => this.queryState.pending && this.queryState.resolvedScopeKey !== this.railSectionQueryKey && !(this.searchQuery && this.snapshot.railSearch.enabled);
|
|
@@ -28822,6 +29308,8 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28822
29308
|
return () => this.listeners.delete(listener);
|
|
28823
29309
|
};
|
|
28824
29310
|
engine;
|
|
29311
|
+
cacheFreshMs;
|
|
29312
|
+
cacheNow;
|
|
28825
29313
|
diagnosticLogger;
|
|
28826
29314
|
diagnosticNow;
|
|
28827
29315
|
diagnosticSlowThresholdMs;
|
|
@@ -28830,9 +29318,12 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28830
29318
|
runtime;
|
|
28831
29319
|
scheduler;
|
|
28832
29320
|
workspaceId;
|
|
29321
|
+
sessionSectionsQueryCache;
|
|
29322
|
+
providerSwitchDiagnostics;
|
|
28833
29323
|
pagingAbortControllers = /* @__PURE__ */ new Map();
|
|
28834
|
-
|
|
28835
|
-
|
|
29324
|
+
targetedPageRefresher;
|
|
29325
|
+
queryState = EMPTY_CONVERSATION_RAIL_QUERY_STATE;
|
|
29326
|
+
searchState = EMPTY_CONVERSATION_SEARCH_QUERY_STATE;
|
|
28836
29327
|
snapshot;
|
|
28837
29328
|
scope = null;
|
|
28838
29329
|
sectionAgentTargetId = "";
|
|
@@ -28848,18 +29339,39 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28848
29339
|
previousMembershipRecords;
|
|
28849
29340
|
unsubscribeEngine = null;
|
|
28850
29341
|
constructor(input) {
|
|
29342
|
+
this.cacheFreshMs = input.cacheFreshMs ?? CONVERSATION_RAIL_QUERY_CACHE_FRESH_MS;
|
|
29343
|
+
this.cacheNow = input.cacheNow ?? Date.now;
|
|
28851
29344
|
this.diagnosticLogger = input.diagnosticLogger ?? createConversationRailDiagnosticLogger(input.runtime);
|
|
28852
29345
|
this.diagnosticNow = input.diagnosticNow ?? Date.now;
|
|
28853
29346
|
this.diagnosticSlowThresholdMs = input.diagnosticSlowThresholdMs ?? CONVERSATION_RAIL_SLOW_DIAGNOSTIC_THRESHOLD_MS;
|
|
28854
29347
|
this.engine = input.engine;
|
|
28855
29348
|
this.getActiveConversationId = input.getActiveConversationId;
|
|
28856
29349
|
this.runtime = input.runtime;
|
|
29350
|
+
this.providerSwitchDiagnostics = new ConversationRailProviderSwitchDiagnosticTracker(
|
|
29351
|
+
this.diagnosticLogger,
|
|
29352
|
+
this.diagnosticNow,
|
|
29353
|
+
input.workspaceId
|
|
29354
|
+
);
|
|
29355
|
+
this.sessionSectionsQueryCache = input.sessionSectionsQueryCache ?? input.runtime.getSessionSectionsQueryCache?.(input.workspaceId) ?? createWorkspaceQueryCache();
|
|
28857
29356
|
this.scheduler = input.scheduler ?? agentGuiScheduler;
|
|
28858
29357
|
this.workspaceId = input.workspaceId;
|
|
28859
|
-
this.
|
|
29358
|
+
this.targetedPageRefresher = new AgentGUIConversationRailTargetedPageRefresher({
|
|
29359
|
+
onResolved: (pages) => {
|
|
29360
|
+
this.upsertSessions(pages.flatMap(({ page }) => page.sessions));
|
|
29361
|
+
this.queryState = replaceConversationRailFirstPages({
|
|
29362
|
+
pages,
|
|
29363
|
+
queryState: this.queryState
|
|
29364
|
+
});
|
|
29365
|
+
this.writeCurrentQueryCache();
|
|
29366
|
+
this.emit();
|
|
29367
|
+
},
|
|
29368
|
+
runtime: this.runtime,
|
|
29369
|
+
workspaceId: this.workspaceId
|
|
29370
|
+
});
|
|
29371
|
+
this.previousMembershipRecords = projectConversationRailMembershipRecords(
|
|
28860
29372
|
this.engine.getSnapshot()
|
|
28861
29373
|
);
|
|
28862
|
-
this.
|
|
29374
|
+
this.emit();
|
|
28863
29375
|
}
|
|
28864
29376
|
attach() {
|
|
28865
29377
|
if (this.attached) return () => {
|
|
@@ -28873,6 +29385,8 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28873
29385
|
return () => this.detach();
|
|
28874
29386
|
}
|
|
28875
29387
|
configure(scope) {
|
|
29388
|
+
const previousScopeKey = this.railSectionQueryKey;
|
|
29389
|
+
const previousAgentTargetId = this.sectionAgentTargetId;
|
|
28876
29390
|
const sectionAgentTargetId = scope.conversationFilter.kind === "agentTarget" ? scope.conversationFilter.agentTargetId.trim() : scope.sectionAgentTargetFallbackId?.trim() ?? "";
|
|
28877
29391
|
const userProjectPathKey = JSON.stringify(
|
|
28878
29392
|
scope.userProjects.map((project) => project.path.trim()).filter((path) => path.length > 0)
|
|
@@ -28885,11 +29399,19 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28885
29399
|
userProjectPathKey
|
|
28886
29400
|
]);
|
|
28887
29401
|
const scopeChanged = nextScopeKey !== this.railSectionQueryKey;
|
|
29402
|
+
this.providerSwitchDiagnostics.configure({
|
|
29403
|
+
attached: this.attached,
|
|
29404
|
+
nextAgentTargetId: sectionAgentTargetId,
|
|
29405
|
+
nextScopeKey,
|
|
29406
|
+
previousAgentTargetId,
|
|
29407
|
+
previousScopeKey
|
|
29408
|
+
});
|
|
28888
29409
|
this.scope = scope;
|
|
28889
29410
|
this.sectionAgentTargetId = sectionAgentTargetId;
|
|
28890
29411
|
this.railSectionQueryKey = nextScopeKey;
|
|
28891
29412
|
if (!scopeChanged) return;
|
|
28892
29413
|
this.cancelPagingRequests();
|
|
29414
|
+
this.targetedPageRefresher.cancel();
|
|
28893
29415
|
this.queryState = {
|
|
28894
29416
|
...this.queryState,
|
|
28895
29417
|
pending: this.runtimeSectionsEnabled(),
|
|
@@ -28925,7 +29447,7 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28925
29447
|
this.pagingAbortControllers.set(section.id, abortController);
|
|
28926
29448
|
this.queryState = {
|
|
28927
29449
|
...this.queryState,
|
|
28928
|
-
sectionPageStates:
|
|
29450
|
+
sectionPageStates: updateConversationRailSectionPageState(
|
|
28929
29451
|
this.queryState.sectionPageStates,
|
|
28930
29452
|
section.id,
|
|
28931
29453
|
{ ...currentPageState, isLoading: true }
|
|
@@ -28935,13 +29457,13 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28935
29457
|
const request = membership.kind === "pinned" ? this.runtime.listPinnedSessionsPage({
|
|
28936
29458
|
agentTargetId: this.sectionAgentTargetId || void 0,
|
|
28937
29459
|
cursor: currentPageState.nextCursor || void 0,
|
|
28938
|
-
limit:
|
|
29460
|
+
limit: SECTION_PAGE_SIZE2,
|
|
28939
29461
|
signal: abortController.signal,
|
|
28940
29462
|
workspaceId: this.workspaceId
|
|
28941
29463
|
}) : this.runtime.listSessionSectionPage({
|
|
28942
29464
|
agentTargetId: this.sectionAgentTargetId || void 0,
|
|
28943
29465
|
cursor: currentPageState.nextCursor || void 0,
|
|
28944
|
-
limit:
|
|
29466
|
+
limit: SECTION_PAGE_SIZE2,
|
|
28945
29467
|
sectionKey: section.id,
|
|
28946
29468
|
signal: abortController.signal,
|
|
28947
29469
|
workspaceId: this.workspaceId
|
|
@@ -28953,7 +29475,7 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28953
29475
|
this.upsertSessions(page.sessions);
|
|
28954
29476
|
this.queryState = {
|
|
28955
29477
|
...this.queryState,
|
|
28956
|
-
sectionPageStates:
|
|
29478
|
+
sectionPageStates: updateConversationRailSectionPageState(
|
|
28957
29479
|
this.queryState.sectionPageStates,
|
|
28958
29480
|
section.id,
|
|
28959
29481
|
{
|
|
@@ -28973,6 +29495,7 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28973
29495
|
} : candidate
|
|
28974
29496
|
) ?? null
|
|
28975
29497
|
};
|
|
29498
|
+
this.writeCurrentQueryCache();
|
|
28976
29499
|
this.emit();
|
|
28977
29500
|
}).catch(() => {
|
|
28978
29501
|
if (abortController.signal.aborted || requestSequence !== this.pagingRequestSequence) {
|
|
@@ -28980,12 +29503,13 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
28980
29503
|
}
|
|
28981
29504
|
this.queryState = {
|
|
28982
29505
|
...this.queryState,
|
|
28983
|
-
sectionPageStates:
|
|
29506
|
+
sectionPageStates: updateConversationRailSectionPageState(
|
|
28984
29507
|
this.queryState.sectionPageStates,
|
|
28985
29508
|
section.id,
|
|
28986
29509
|
{ ...currentPageState, isLoading: false }
|
|
28987
29510
|
)
|
|
28988
29511
|
};
|
|
29512
|
+
this.writeCurrentQueryCache();
|
|
28989
29513
|
this.emit();
|
|
28990
29514
|
}).finally(() => {
|
|
28991
29515
|
if (this.pagingAbortControllers.get(section.id) === abortController) {
|
|
@@ -29007,7 +29531,7 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29007
29531
|
void listSessionsPage({
|
|
29008
29532
|
agentTargetId: this.sectionAgentTargetId || void 0,
|
|
29009
29533
|
cursor: this.searchState.nextCursor ?? void 0,
|
|
29010
|
-
limit:
|
|
29534
|
+
limit: 100,
|
|
29011
29535
|
searchQuery: this.searchQuery,
|
|
29012
29536
|
signal: abortController.signal,
|
|
29013
29537
|
workspaceId: this.workspaceId
|
|
@@ -29045,19 +29569,24 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29045
29569
|
this.requestSearch();
|
|
29046
29570
|
};
|
|
29047
29571
|
handleEngineState(state) {
|
|
29048
|
-
const next =
|
|
29572
|
+
const next = projectConversationRailMembershipRecords(state);
|
|
29049
29573
|
if (this.ingestingSessions || !this.runtimeSectionsEnabled()) {
|
|
29050
29574
|
this.previousMembershipRecords = next;
|
|
29051
29575
|
return;
|
|
29052
29576
|
}
|
|
29053
29577
|
const plan = planRuntimeRailMembershipRefresh({
|
|
29054
29578
|
activeConversationId: this.getActiveConversationId(),
|
|
29579
|
+
agentTargetId: this.sectionAgentTargetId || null,
|
|
29055
29580
|
loadedSections: this.queryState.sections,
|
|
29056
29581
|
next,
|
|
29057
|
-
previous: this.previousMembershipRecords
|
|
29582
|
+
previous: this.previousMembershipRecords,
|
|
29583
|
+
searchActive: Boolean(this.searchQuery && this.searchEnabled())
|
|
29058
29584
|
});
|
|
29059
29585
|
this.previousMembershipRecords = next;
|
|
29060
|
-
if (plan.kind !== "
|
|
29586
|
+
if (plan.kind !== "refresh_pages") return;
|
|
29587
|
+
if (plan.pageIds.length > 0 && this.railSectionQueryKey) {
|
|
29588
|
+
this.sessionSectionsQueryCache.invalidate(this.railSectionQueryKey);
|
|
29589
|
+
}
|
|
29061
29590
|
this.queryState = {
|
|
29062
29591
|
...this.queryState,
|
|
29063
29592
|
reconcilingSessionIds: mergeConversationRailSessionIds(
|
|
@@ -29066,62 +29595,73 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29066
29595
|
)
|
|
29067
29596
|
};
|
|
29068
29597
|
this.emit();
|
|
29069
|
-
this.
|
|
29598
|
+
if (plan.refreshSearch) this.requestSearch();
|
|
29599
|
+
this.cancelPagingRequests();
|
|
29600
|
+
this.targetedPageRefresher.refresh({
|
|
29601
|
+
agentTargetId: this.sectionAgentTargetId,
|
|
29602
|
+
pageIds: plan.pageIds
|
|
29603
|
+
});
|
|
29070
29604
|
}
|
|
29071
29605
|
refreshFirstPages(refreshReason) {
|
|
29072
29606
|
const listSections = this.runtime.listSessionSections;
|
|
29073
29607
|
const scopeKey = this.railSectionQueryKey;
|
|
29074
29608
|
if (!this.runtimeSectionsEnabled() || !listSections || !scopeKey) {
|
|
29075
|
-
this.queryState =
|
|
29609
|
+
this.queryState = EMPTY_CONVERSATION_RAIL_QUERY_STATE;
|
|
29610
|
+
this.emit();
|
|
29611
|
+
return;
|
|
29612
|
+
}
|
|
29613
|
+
const cached = this.sessionSectionsQueryCache.read(scopeKey);
|
|
29614
|
+
const cacheApplyStartedAt = cached && this.providerSwitchDiagnostics.hasPending(scopeKey) ? this.diagnosticNow() : null;
|
|
29615
|
+
if (cached && this.queryState.resolvedScopeKey !== scopeKey) {
|
|
29616
|
+
this.applyCachedFirstPages(scopeKey, cached);
|
|
29076
29617
|
this.emit();
|
|
29618
|
+
}
|
|
29619
|
+
if (cached && !cached.stale && this.cacheNow() - cached.resolvedAtUnixMs <= this.cacheFreshMs) {
|
|
29620
|
+
this.providerSwitchDiagnostics.complete(scopeKey, {
|
|
29621
|
+
cacheStatus: "fresh",
|
|
29622
|
+
controllerApplyMs: cacheApplyStartedAt === null ? 0 : Math.max(0, this.diagnosticNow() - cacheApplyStartedAt),
|
|
29623
|
+
requestMs: 0,
|
|
29624
|
+
returnedSessionCount: cached.value.returnedSessionCount,
|
|
29625
|
+
sectionCount: cached.value.sectionCount,
|
|
29626
|
+
status: "ready"
|
|
29627
|
+
});
|
|
29077
29628
|
return;
|
|
29078
29629
|
}
|
|
29630
|
+
const cacheStatus = cached ? "stale" : "miss";
|
|
29631
|
+
this.providerSwitchDiagnostics.setCacheStatus(scopeKey, cacheStatus);
|
|
29079
29632
|
this.pagingRequestSequence += 1;
|
|
29080
29633
|
const requestSequence = this.pagingRequestSequence;
|
|
29081
29634
|
const requestStartedAt = this.diagnosticNow();
|
|
29082
29635
|
const wasResolvedForScope = this.queryState.resolvedScopeKey === scopeKey && this.queryState.sections !== null;
|
|
29083
29636
|
this.cancelPagingRequests(false);
|
|
29084
|
-
const abortController = new AbortController();
|
|
29085
|
-
this.pagingAbortControllers.set("__first_pages__", abortController);
|
|
29086
29637
|
this.queryState = {
|
|
29087
29638
|
...this.queryState,
|
|
29088
29639
|
pending: true
|
|
29089
29640
|
};
|
|
29090
29641
|
this.emit();
|
|
29091
|
-
void
|
|
29092
|
-
|
|
29093
|
-
|
|
29094
|
-
|
|
29095
|
-
|
|
29096
|
-
|
|
29097
|
-
|
|
29642
|
+
void this.sessionSectionsQueryCache.request(scopeKey, async () => {
|
|
29643
|
+
const page = await listSections({
|
|
29644
|
+
agentTargetId: this.sectionAgentTargetId || void 0,
|
|
29645
|
+
limitPerSection: SECTION_PAGE_SIZE2,
|
|
29646
|
+
workspaceId: this.workspaceId
|
|
29647
|
+
});
|
|
29648
|
+
return cachedConversationRailQueryFromFirstPages(page, scopeKey);
|
|
29649
|
+
}).then((entry) => {
|
|
29650
|
+
if (requestSequence !== this.pagingRequestSequence || scopeKey !== this.railSectionQueryKey) {
|
|
29098
29651
|
return;
|
|
29099
29652
|
}
|
|
29100
29653
|
const requestResolvedAt = this.diagnosticNow();
|
|
29101
|
-
|
|
29102
|
-
pinned: page.pinned,
|
|
29103
|
-
sections: page.sections
|
|
29104
|
-
});
|
|
29105
|
-
this.upsertSessions([
|
|
29106
|
-
...page.pinned?.sessions ?? [],
|
|
29107
|
-
...page.sections.flatMap((section) => section.sessions)
|
|
29108
|
-
]);
|
|
29109
|
-
const sectionPageStates = /* @__PURE__ */ new Map();
|
|
29110
|
-
if (page.pinned) {
|
|
29111
|
-
sectionPageStates.set("pinned", pageState(page.pinned));
|
|
29112
|
-
}
|
|
29113
|
-
for (const section of page.sections) {
|
|
29114
|
-
sectionPageStates.set(section.sectionKey, pageState(section));
|
|
29115
|
-
}
|
|
29116
|
-
this.queryState = {
|
|
29117
|
-
pending: false,
|
|
29118
|
-
reconcilingSessionIds: [],
|
|
29119
|
-
resolvedScopeKey: scopeKey,
|
|
29120
|
-
sectionPageStates,
|
|
29121
|
-
sections
|
|
29122
|
-
};
|
|
29654
|
+
this.applyCachedFirstPages(scopeKey, entry);
|
|
29123
29655
|
this.emit();
|
|
29124
29656
|
const completedAt = this.diagnosticNow();
|
|
29657
|
+
this.providerSwitchDiagnostics.complete(scopeKey, {
|
|
29658
|
+
cacheStatus,
|
|
29659
|
+
controllerApplyMs: Math.max(0, completedAt - requestResolvedAt),
|
|
29660
|
+
requestMs: Math.max(0, requestResolvedAt - requestStartedAt),
|
|
29661
|
+
returnedSessionCount: entry.value.returnedSessionCount,
|
|
29662
|
+
sectionCount: entry.value.sectionCount,
|
|
29663
|
+
status: "ready"
|
|
29664
|
+
});
|
|
29125
29665
|
emitConversationRailFirstPagesDiagnostic({
|
|
29126
29666
|
agentTargetId: this.sectionAgentTargetId || null,
|
|
29127
29667
|
controllerApplyMs: Math.max(0, completedAt - requestResolvedAt),
|
|
@@ -29131,19 +29671,25 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29131
29671
|
requestId: requestSequence,
|
|
29132
29672
|
requestMs: Math.max(0, requestResolvedAt - requestStartedAt),
|
|
29133
29673
|
refreshReason,
|
|
29134
|
-
returnedSessionCount:
|
|
29135
|
-
|
|
29136
|
-
0
|
|
29137
|
-
),
|
|
29138
|
-
sectionCount: page.sections.length + (page.pinned ? 1 : 0),
|
|
29674
|
+
returnedSessionCount: entry.value.returnedSessionCount,
|
|
29675
|
+
sectionCount: entry.value.sectionCount,
|
|
29139
29676
|
status: "ready",
|
|
29140
29677
|
workspaceId: this.workspaceId
|
|
29141
29678
|
});
|
|
29142
29679
|
}).catch((error) => {
|
|
29143
|
-
if (
|
|
29680
|
+
if (requestSequence !== this.pagingRequestSequence || scopeKey !== this.railSectionQueryKey) {
|
|
29144
29681
|
return;
|
|
29145
29682
|
}
|
|
29146
29683
|
const failedAt = this.diagnosticNow();
|
|
29684
|
+
this.providerSwitchDiagnostics.complete(scopeKey, {
|
|
29685
|
+
cacheStatus,
|
|
29686
|
+
controllerApplyMs: 0,
|
|
29687
|
+
error,
|
|
29688
|
+
requestMs: Math.max(0, failedAt - requestStartedAt),
|
|
29689
|
+
returnedSessionCount: 0,
|
|
29690
|
+
sectionCount: 0,
|
|
29691
|
+
status: "error"
|
|
29692
|
+
});
|
|
29147
29693
|
emitConversationRailFirstPagesDiagnostic({
|
|
29148
29694
|
agentTargetId: this.sectionAgentTargetId || null,
|
|
29149
29695
|
controllerApplyMs: 0,
|
|
@@ -29171,10 +29717,21 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29171
29717
|
sections: []
|
|
29172
29718
|
};
|
|
29173
29719
|
this.emit();
|
|
29174
|
-
})
|
|
29175
|
-
|
|
29176
|
-
|
|
29177
|
-
|
|
29720
|
+
});
|
|
29721
|
+
}
|
|
29722
|
+
applyCachedFirstPages(scopeKey, entry) {
|
|
29723
|
+
this.queryState = applyCachedConversationRailQuery({
|
|
29724
|
+
cache: this.sessionSectionsQueryCache,
|
|
29725
|
+
entry,
|
|
29726
|
+
scopeKey,
|
|
29727
|
+
upsertSessions: (sessions) => this.upsertSessions(sessions)
|
|
29728
|
+
});
|
|
29729
|
+
}
|
|
29730
|
+
writeCurrentQueryCache() {
|
|
29731
|
+
writeConversationRailQueryCache({
|
|
29732
|
+
cache: this.sessionSectionsQueryCache,
|
|
29733
|
+
queryState: this.queryState,
|
|
29734
|
+
scopeKey: this.railSectionQueryKey
|
|
29178
29735
|
});
|
|
29179
29736
|
}
|
|
29180
29737
|
requestSearch() {
|
|
@@ -29190,7 +29747,7 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29190
29747
|
this.searchAbortController = null;
|
|
29191
29748
|
const listSessionsPage = this.runtime.listSessionsPage;
|
|
29192
29749
|
if (!this.searchRequestKey || !listSessionsPage) {
|
|
29193
|
-
this.searchState =
|
|
29750
|
+
this.searchState = EMPTY_CONVERSATION_SEARCH_QUERY_STATE;
|
|
29194
29751
|
this.emit();
|
|
29195
29752
|
return;
|
|
29196
29753
|
}
|
|
@@ -29199,14 +29756,14 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29199
29756
|
const abortController = new AbortController();
|
|
29200
29757
|
this.searchAbortController = abortController;
|
|
29201
29758
|
this.searchState = {
|
|
29202
|
-
...
|
|
29759
|
+
...EMPTY_CONVERSATION_SEARCH_QUERY_STATE,
|
|
29203
29760
|
pending: true,
|
|
29204
29761
|
requestKey
|
|
29205
29762
|
};
|
|
29206
29763
|
this.emit();
|
|
29207
29764
|
void listSessionsPage({
|
|
29208
29765
|
agentTargetId: this.sectionAgentTargetId || void 0,
|
|
29209
|
-
limit:
|
|
29766
|
+
limit: 100,
|
|
29210
29767
|
searchQuery: query,
|
|
29211
29768
|
signal: abortController.signal,
|
|
29212
29769
|
workspaceId: this.workspaceId
|
|
@@ -29231,7 +29788,7 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29231
29788
|
return;
|
|
29232
29789
|
}
|
|
29233
29790
|
this.searchState = {
|
|
29234
|
-
...
|
|
29791
|
+
...EMPTY_CONVERSATION_SEARCH_QUERY_STATE,
|
|
29235
29792
|
failed: true,
|
|
29236
29793
|
requestKey,
|
|
29237
29794
|
resolvedQuery: query
|
|
@@ -29263,14 +29820,13 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29263
29820
|
this.searchDebounceTask = null;
|
|
29264
29821
|
}
|
|
29265
29822
|
upsertSessions(sessions) {
|
|
29823
|
+
if (sessions.length === 0) return;
|
|
29266
29824
|
this.ingestingSessions = true;
|
|
29267
29825
|
try {
|
|
29268
|
-
|
|
29269
|
-
this.engine.dispatch({ type: "session/upserted", session });
|
|
29270
|
-
}
|
|
29826
|
+
this.engine.dispatch({ type: "session/snapshotReceived", sessions });
|
|
29271
29827
|
} finally {
|
|
29272
29828
|
this.ingestingSessions = false;
|
|
29273
|
-
this.previousMembershipRecords =
|
|
29829
|
+
this.previousMembershipRecords = projectConversationRailMembershipRecords(
|
|
29274
29830
|
this.engine.getSnapshot()
|
|
29275
29831
|
);
|
|
29276
29832
|
}
|
|
@@ -29283,27 +29839,15 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29283
29839
|
searchEnabled() {
|
|
29284
29840
|
return Boolean(!this.scope?.previewMode && this.runtime.listSessionsPage);
|
|
29285
29841
|
}
|
|
29286
|
-
buildSnapshot() {
|
|
29287
|
-
const searchResolved = this.searchState.requestKey === this.searchRequestKey && this.searchState.resolvedQuery === this.searchQuery;
|
|
29288
|
-
return {
|
|
29289
|
-
railSearch: {
|
|
29290
|
-
enabled: this.searchEnabled(),
|
|
29291
|
-
failed: searchResolved && this.searchState.failed,
|
|
29292
|
-
hasMore: searchResolved && this.searchState.hasMore,
|
|
29293
|
-
loadingMore: searchResolved && this.searchState.loadingMore,
|
|
29294
|
-
pending: Boolean(this.searchQuery) && (!searchResolved || this.searchState.pending),
|
|
29295
|
-
resolvedQuery: searchResolved ? this.searchState.resolvedQuery : "",
|
|
29296
|
-
sessionIds: searchResolved ? this.searchState.sessionIds : []
|
|
29297
|
-
},
|
|
29298
|
-
runtimeSectionsEnabled: this.runtimeSectionsEnabled(),
|
|
29299
|
-
runtimeRailMemberships: this.queryState.sections,
|
|
29300
|
-
runtimeRailReconcilingSessionIds: this.queryState.reconcilingSessionIds,
|
|
29301
|
-
runtimeRailSectionsPending: this.queryState.pending,
|
|
29302
|
-
sectionPageStates: this.queryState.sectionPageStates
|
|
29303
|
-
};
|
|
29304
|
-
}
|
|
29305
29842
|
emit() {
|
|
29306
|
-
this.snapshot =
|
|
29843
|
+
this.snapshot = buildConversationRailQuerySnapshot({
|
|
29844
|
+
queryState: this.queryState,
|
|
29845
|
+
runtimeSectionsEnabled: this.runtimeSectionsEnabled(),
|
|
29846
|
+
searchEnabled: this.searchEnabled(),
|
|
29847
|
+
searchQuery: this.searchQuery,
|
|
29848
|
+
searchRequestKey: this.searchRequestKey,
|
|
29849
|
+
searchState: this.searchState
|
|
29850
|
+
});
|
|
29307
29851
|
for (const listener of this.listeners) listener(this.snapshot);
|
|
29308
29852
|
}
|
|
29309
29853
|
cancelPagingRequests(incrementSequence = true) {
|
|
@@ -29319,44 +29863,13 @@ var AgentGUIConversationRailQueryController = class {
|
|
|
29319
29863
|
this.unsubscribeEngine?.();
|
|
29320
29864
|
this.unsubscribeEngine = null;
|
|
29321
29865
|
this.cancelPagingRequests();
|
|
29866
|
+
this.targetedPageRefresher.cancel();
|
|
29322
29867
|
this.clearSearchDebounceTimer();
|
|
29323
29868
|
this.searchRequestSequence += 1;
|
|
29324
29869
|
this.searchAbortController?.abort();
|
|
29325
29870
|
this.searchAbortController = null;
|
|
29326
29871
|
}
|
|
29327
29872
|
};
|
|
29328
|
-
function membershipRecords(state) {
|
|
29329
|
-
const sessions = selectWorkspaceAgentConsumerSessions3(state);
|
|
29330
|
-
const canonicalIds = new Set(
|
|
29331
|
-
sessions.map((item) => item.session.agentSessionId)
|
|
29332
|
-
);
|
|
29333
|
-
return [
|
|
29334
|
-
...sessions.map((item) => ({
|
|
29335
|
-
id: item.session.agentSessionId,
|
|
29336
|
-
pinnedAtUnixMs: item.session.pinnedAtUnixMs ?? null
|
|
29337
|
-
})),
|
|
29338
|
-
...selectPendingActivations3(state).filter(
|
|
29339
|
-
(record) => record.mode === "new" && record.status !== "failed" && !canonicalIds.has(record.agentSessionId)
|
|
29340
|
-
).map((record) => ({
|
|
29341
|
-
id: record.agentSessionId,
|
|
29342
|
-
pinnedAtUnixMs: null,
|
|
29343
|
-
projectionSource: "pending_activation"
|
|
29344
|
-
}))
|
|
29345
|
-
];
|
|
29346
|
-
}
|
|
29347
|
-
function pageState(page) {
|
|
29348
|
-
return {
|
|
29349
|
-
hasMore: page.hasMore,
|
|
29350
|
-
isLoading: false,
|
|
29351
|
-
nextCursor: page.nextCursor ?? null,
|
|
29352
|
-
totalCount: page.totalCount
|
|
29353
|
-
};
|
|
29354
|
-
}
|
|
29355
|
-
function updateSectionPageState(current, sectionId, value) {
|
|
29356
|
-
const next = new Map(current);
|
|
29357
|
-
next.set(sectionId, value);
|
|
29358
|
-
return next;
|
|
29359
|
-
}
|
|
29360
29873
|
|
|
29361
29874
|
// agent-gui/agentGuiNode/controller/useAgentGUIConversationRailQuery.ts
|
|
29362
29875
|
function useAgentGUIConversationRailQuery({
|
|
@@ -29373,7 +29886,7 @@ function useAgentGUIConversationRailQuery({
|
|
|
29373
29886
|
() => runtime.getSessionEngine(workspaceId),
|
|
29374
29887
|
[runtime, workspaceId]
|
|
29375
29888
|
);
|
|
29376
|
-
const activeConversationIdRef =
|
|
29889
|
+
const activeConversationIdRef = useRef36(activeConversationId);
|
|
29377
29890
|
activeConversationIdRef.current = activeConversationId;
|
|
29378
29891
|
const controller = useMemo33(
|
|
29379
29892
|
() => new AgentGUIConversationRailQueryController({
|
|
@@ -29477,16 +29990,16 @@ var AgentGUIConversationRailController = memo8(
|
|
|
29477
29990
|
// agent-gui/agentGuiNode/view/AgentGUIDetailPane.tsx
|
|
29478
29991
|
import {
|
|
29479
29992
|
memo as memo12,
|
|
29480
|
-
useCallback as
|
|
29993
|
+
useCallback as useCallback46,
|
|
29481
29994
|
useEffect as useEffect34,
|
|
29482
29995
|
useMemo as useMemo35,
|
|
29483
|
-
useRef as
|
|
29996
|
+
useRef as useRef39,
|
|
29484
29997
|
useState as useState33
|
|
29485
29998
|
} from "react";
|
|
29486
29999
|
import { ScrollArea as ScrollArea2 } from "@tutti-os/ui-system/components";
|
|
29487
30000
|
|
|
29488
30001
|
// agent-gui/agentGuiNode/view/agentGUIDetailModelHelpers.ts
|
|
29489
|
-
import { useRef as
|
|
30002
|
+
import { useRef as useRef37 } from "react";
|
|
29490
30003
|
function commandAppSource(command) {
|
|
29491
30004
|
if (!command || typeof command !== "object" || !("source" in command)) {
|
|
29492
30005
|
return null;
|
|
@@ -29566,7 +30079,7 @@ function slashStatusesEqual(left, right) {
|
|
|
29566
30079
|
return (left.agentSessionId ?? null) === (right.agentSessionId ?? null) && (left.baseUrl ?? null) === (right.baseUrl ?? null) && (left.contextWindow?.usedTokens ?? null) === (right.contextWindow?.usedTokens ?? null) && (left.contextWindow?.totalTokens ?? null) === (right.contextWindow?.totalTokens ?? null) && slashStatusLimitsEqual(left.limits, right.limits) && Boolean(left.limitsLoading) === Boolean(right.limitsLoading) && Boolean(left.limitsUnavailable) === Boolean(right.limitsUnavailable);
|
|
29567
30080
|
}
|
|
29568
30081
|
function useStableSlashStatus(status) {
|
|
29569
|
-
const statusRef =
|
|
30082
|
+
const statusRef = useRef37(null);
|
|
29570
30083
|
if (statusRef.current === null || !slashStatusesEqual(statusRef.current, status)) {
|
|
29571
30084
|
statusRef.current = status;
|
|
29572
30085
|
}
|
|
@@ -29608,6 +30121,11 @@ function resolveActiveConversationBusyStatus(input) {
|
|
|
29608
30121
|
}
|
|
29609
30122
|
return null;
|
|
29610
30123
|
}
|
|
30124
|
+
function shouldShowAgentGUIStopButton(input) {
|
|
30125
|
+
if (input.isUnavailable || input.isAuthBlocked) return false;
|
|
30126
|
+
if (input.isCreatingConversation || input.isCancelPending) return true;
|
|
30127
|
+
return !input.isSubmitting && (input.isConversationBusy || input.hasPendingApproval || input.hasPendingInteractivePrompt || input.isInterrupting);
|
|
30128
|
+
}
|
|
29611
30129
|
function buildAgentConversationHandoffPrompt(input) {
|
|
29612
30130
|
const conversation = input.activeConversation;
|
|
29613
30131
|
if (!conversation) {
|
|
@@ -29718,7 +30236,8 @@ function AgentGoalBanner({
|
|
|
29718
30236
|
status,
|
|
29719
30237
|
tokenBudget,
|
|
29720
30238
|
tokensUsed,
|
|
29721
|
-
|
|
30239
|
+
durationMs,
|
|
30240
|
+
optimistic = false,
|
|
29722
30241
|
labels,
|
|
29723
30242
|
onEditObjective,
|
|
29724
30243
|
onPauseGoal,
|
|
@@ -29729,7 +30248,7 @@ function AgentGoalBanner({
|
|
|
29729
30248
|
const [editDraft, setEditDraft] = useState29(null);
|
|
29730
30249
|
const normalizedStatus = normalizeGoalStatus(status);
|
|
29731
30250
|
const isActive = normalizedStatus === "" || normalizedStatus === "active";
|
|
29732
|
-
const serverSeconds = typeof
|
|
30251
|
+
const serverSeconds = optimistic ? null : typeof durationMs === "number" && durationMs >= 0 ? Math.floor(durationMs / 1e3) : isActive ? 0 : null;
|
|
29733
30252
|
const [localElapsed, setLocalElapsed] = useState29(0);
|
|
29734
30253
|
useEffect32(() => {
|
|
29735
30254
|
setLocalElapsed(0);
|
|
@@ -29899,8 +30418,9 @@ var AgentGUIBottomDockPane = memo9(function AgentGUIBottomDockPane2({
|
|
|
29899
30418
|
const goalObjective = goal ? stringValue3(goal.objective) : "";
|
|
29900
30419
|
const goalStatus = goal ? stringValue3(goal.status) : "";
|
|
29901
30420
|
const goalTokenBudget = goal ? numberValue(goal.tokenBudget) : null;
|
|
29902
|
-
const goalTokensUsed = goal ? numberValue(goal.
|
|
29903
|
-
const
|
|
30421
|
+
const goalTokensUsed = goal ? numberValue(goal.tokens) : null;
|
|
30422
|
+
const goalDurationMs = goal ? numberValue(goal.durationMs) : null;
|
|
30423
|
+
const goalIsOptimistic = sessionChrome.rawState?.goalIsOptimistic === true;
|
|
29904
30424
|
const showGoalBanner = isGoalBannerVisible(goalObjective, goalStatus);
|
|
29905
30425
|
return /* @__PURE__ */ jsxs37(
|
|
29906
30426
|
"div",
|
|
@@ -29976,7 +30496,8 @@ var AgentGUIBottomDockPane = memo9(function AgentGUIBottomDockPane2({
|
|
|
29976
30496
|
status: goalStatus,
|
|
29977
30497
|
tokenBudget: goalTokenBudget ?? void 0,
|
|
29978
30498
|
tokensUsed: goalTokensUsed ?? void 0,
|
|
29979
|
-
|
|
30499
|
+
durationMs: goalDurationMs ?? void 0,
|
|
30500
|
+
optimistic: goalIsOptimistic,
|
|
29980
30501
|
labels: goalBannerLabels,
|
|
29981
30502
|
onPauseGoal: goalPauseSupported ? () => onGoalControl("pause") : void 0,
|
|
29982
30503
|
onResumeGoal: goalPauseSupported ? () => onGoalControl("resume") : void 0,
|
|
@@ -30162,10 +30683,10 @@ function setTimelineScrollTopWithUserTransition(element, top) {
|
|
|
30162
30683
|
|
|
30163
30684
|
// agent-gui/agentGuiNode/view/useAgentGUIDetailScroll.ts
|
|
30164
30685
|
import {
|
|
30165
|
-
useCallback as
|
|
30686
|
+
useCallback as useCallback45,
|
|
30166
30687
|
useEffect as useEffect33,
|
|
30167
30688
|
useLayoutEffect as useLayoutEffect7,
|
|
30168
|
-
useRef as
|
|
30689
|
+
useRef as useRef38,
|
|
30169
30690
|
useState as useState31
|
|
30170
30691
|
} from "react";
|
|
30171
30692
|
var AGENT_GUI_STICK_TO_BOTTOM_THRESHOLD_PX = 24;
|
|
@@ -30187,8 +30708,8 @@ function useAgentGUIDetailScroll(input) {
|
|
|
30187
30708
|
} = input;
|
|
30188
30709
|
const [isTimelineScrolledToTop, setIsTimelineScrolledToTop] = useState31(true);
|
|
30189
30710
|
const [isTimelineScrolledToBottom, setIsTimelineScrolledToBottom] = useState31(true);
|
|
30190
|
-
const bottomLockOwnerRef =
|
|
30191
|
-
const userScrollAwayIntentConversationRef =
|
|
30711
|
+
const bottomLockOwnerRef = useRef38(null);
|
|
30712
|
+
const userScrollAwayIntentConversationRef = useRef38(null);
|
|
30192
30713
|
useLayoutEffect7(() => {
|
|
30193
30714
|
const timeline = timelineRef.current;
|
|
30194
30715
|
if (!timeline) {
|
|
@@ -30470,7 +30991,7 @@ function useAgentGUIDetailScroll(input) {
|
|
|
30470
30991
|
viewModel.detail.hasOlderMessages,
|
|
30471
30992
|
viewModel.detail.isLoadingOlderMessages
|
|
30472
30993
|
]);
|
|
30473
|
-
const scrollTimelineToBottom =
|
|
30994
|
+
const scrollTimelineToBottom = useCallback45(() => {
|
|
30474
30995
|
const timeline = timelineRef.current;
|
|
30475
30996
|
const activeConversationId = timelineConversationId;
|
|
30476
30997
|
if (!timeline || !activeConversationId) {
|
|
@@ -30592,7 +31113,10 @@ function useAgentGUIDetailModel(input) {
|
|
|
30592
31113
|
conversation: targetConversation
|
|
30593
31114
|
});
|
|
30594
31115
|
const hasActiveConversation = viewModel.rail.activeConversationId !== null;
|
|
30595
|
-
const selectedAgentTargetComingSoon =
|
|
31116
|
+
const selectedAgentTargetComingSoon = isAgentGUIAgentTargetComingSoon(
|
|
31117
|
+
viewModel.rail.selectedAgentTarget,
|
|
31118
|
+
viewModel.rail.comingSoonProviders
|
|
31119
|
+
);
|
|
30596
31120
|
const emptyProviderReadinessGate = !hasActiveConversation ? selectedAgentTargetComingSoon ? { status: "coming_soon" } : viewModel.readiness.providerReadinessGate : null;
|
|
30597
31121
|
const activePrompt = viewModel.interaction.pendingInteractivePrompt ?? viewModel.interaction.pendingApproval;
|
|
30598
31122
|
const activePromptRequestId = activePrompt?.requestId ?? null;
|
|
@@ -30682,7 +31206,17 @@ function useAgentGUIDetailModel(input) {
|
|
|
30682
31206
|
const hasNonRetryableRecoveryFailure = sessionChrome.recovery?.kind === "failed" && sessionChrome.recovery.canRetry === false || sessionChrome.recovery?.kind === "resume-unavailable";
|
|
30683
31207
|
const submitDisabled = hasNonRetryableRecoveryFailure || isCollaboratorConversation || !viewModel.composer.canSubmit && !canQueueWhileBusy;
|
|
30684
31208
|
const composerDisabled = hasNonRetryableRecoveryFailure || isCollaboratorConversation || !canQueueWhileBusy && (viewModel.interaction.pendingApproval !== null || viewModel.interaction.pendingInteractivePrompt !== null || viewModel.composer.isSubmitting || viewModel.composer.isInterrupting || viewModel.composer.isCreatingConversation);
|
|
30685
|
-
const showStopButton =
|
|
31209
|
+
const showStopButton = shouldShowAgentGUIStopButton({
|
|
31210
|
+
hasPendingApproval: viewModel.interaction.pendingApproval !== null,
|
|
31211
|
+
hasPendingInteractivePrompt: viewModel.interaction.pendingInteractivePrompt !== null,
|
|
31212
|
+
isAuthBlocked: sessionChrome.auth !== null,
|
|
31213
|
+
isCancelPending: viewModel.composer.isCancelPending,
|
|
31214
|
+
isConversationBusy: activeConversationTurnBusy,
|
|
31215
|
+
isCreatingConversation: viewModel.composer.isCreatingConversation,
|
|
31216
|
+
isInterrupting: viewModel.composer.isInterrupting,
|
|
31217
|
+
isSubmitting: viewModel.composer.isSubmitting,
|
|
31218
|
+
isUnavailable: viewModel.readiness.activeLiveState === "failed"
|
|
31219
|
+
});
|
|
30686
31220
|
const conversationFlowLabels = useMemo34(
|
|
30687
31221
|
() => ({
|
|
30688
31222
|
thinkingLabel: labels.thinkingLabel,
|
|
@@ -30767,6 +31301,7 @@ function useAgentGUIDetailModel(input) {
|
|
|
30767
31301
|
const interactivePromptLabels = useMemo34(
|
|
30768
31302
|
() => ({
|
|
30769
31303
|
approvalLead: labels.approvalRequired,
|
|
31304
|
+
fileChangeApprovalLead: labels.fileChangeApprovalRequired,
|
|
30770
31305
|
planLead: labels.planLead,
|
|
30771
31306
|
planModes: labels.planModes,
|
|
30772
31307
|
stayInPlan: labels.stayInPlan,
|
|
@@ -30786,6 +31321,7 @@ function useAgentGUIDetailModel(input) {
|
|
|
30786
31321
|
[
|
|
30787
31322
|
labels.answerPlaceholder,
|
|
30788
31323
|
labels.approvalRequired,
|
|
31324
|
+
labels.fileChangeApprovalRequired,
|
|
30789
31325
|
labels.feedbackPlaceholder,
|
|
30790
31326
|
labels.nextQuestion,
|
|
30791
31327
|
labels.planLead,
|
|
@@ -31161,11 +31697,11 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31161
31697
|
renderProviderUnavailableState
|
|
31162
31698
|
}) {
|
|
31163
31699
|
"use memo";
|
|
31164
|
-
const timelineRef =
|
|
31165
|
-
const bottomDockRef =
|
|
31166
|
-
const timelineScrollAnchorRef =
|
|
31167
|
-
const submittedPromptScrollConversationRef =
|
|
31168
|
-
const pendingPrependScrollAnchorRef =
|
|
31700
|
+
const timelineRef = useRef39(null);
|
|
31701
|
+
const bottomDockRef = useRef39(null);
|
|
31702
|
+
const timelineScrollAnchorRef = useRef39(null);
|
|
31703
|
+
const submittedPromptScrollConversationRef = useRef39(null);
|
|
31704
|
+
const pendingPrependScrollAnchorRef = useRef39(null);
|
|
31169
31705
|
const [
|
|
31170
31706
|
bottomDockDismissedPromptRequestId,
|
|
31171
31707
|
setBottomDockDismissedPromptRequestId
|
|
@@ -31206,7 +31742,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31206
31742
|
slashStatusLimitsUnavailable,
|
|
31207
31743
|
viewModel
|
|
31208
31744
|
});
|
|
31209
|
-
const handleInterruptCurrentTurn =
|
|
31745
|
+
const handleInterruptCurrentTurn = useCallback46(() => {
|
|
31210
31746
|
actions.interruptCurrentTurn(labels.noRunningResponse);
|
|
31211
31747
|
}, [actions.interruptCurrentTurn, labels.noRunningResponse]);
|
|
31212
31748
|
const submitApprovalOption = useStableEventCallback(
|
|
@@ -31226,14 +31762,14 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31226
31762
|
const selectHomeComposerAgentTarget = useStableEventCallback(
|
|
31227
31763
|
actions.selectHomeComposerAgentTarget
|
|
31228
31764
|
);
|
|
31229
|
-
const selectHomeComposerAgentTargetAndFocus =
|
|
31765
|
+
const selectHomeComposerAgentTargetAndFocus = useCallback46(
|
|
31230
31766
|
(input) => {
|
|
31231
31767
|
selectHomeComposerAgentTarget(input);
|
|
31232
31768
|
onRequestComposerFocus();
|
|
31233
31769
|
},
|
|
31234
31770
|
[onRequestComposerFocus, selectHomeComposerAgentTarget]
|
|
31235
31771
|
);
|
|
31236
|
-
const handleSelectHomeSuggestion =
|
|
31772
|
+
const handleSelectHomeSuggestion = useCallback46(
|
|
31237
31773
|
(prompt) => {
|
|
31238
31774
|
updateDraftContent(
|
|
31239
31775
|
updateAgentComposerDraft(viewModel.composer.draftContent, { prompt })
|
|
@@ -31241,7 +31777,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31241
31777
|
},
|
|
31242
31778
|
[updateDraftContent, viewModel.composer.draftContent]
|
|
31243
31779
|
);
|
|
31244
|
-
const handleHomeSuggestionAction =
|
|
31780
|
+
const handleHomeSuggestionAction = useCallback46(
|
|
31245
31781
|
(action) => {
|
|
31246
31782
|
if (action === "import-session") {
|
|
31247
31783
|
window.dispatchEvent(
|
|
@@ -31256,7 +31792,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31256
31792
|
const submitGuidancePrompt = useStableEventCallback(
|
|
31257
31793
|
actions.submitGuidancePrompt
|
|
31258
31794
|
);
|
|
31259
|
-
const requestSubmittedPromptScrollToBottom =
|
|
31795
|
+
const requestSubmittedPromptScrollToBottom = useCallback46(() => {
|
|
31260
31796
|
const activeConversationId = viewModel.rail.activeConversationId;
|
|
31261
31797
|
if (!activeConversationId) {
|
|
31262
31798
|
return;
|
|
@@ -31264,7 +31800,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31264
31800
|
submittedPromptScrollConversationRef.current = activeConversationId;
|
|
31265
31801
|
pendingPrependScrollAnchorRef.current = null;
|
|
31266
31802
|
}, [viewModel.rail.activeConversationId]);
|
|
31267
|
-
const submitPromptAndScrollToBottom =
|
|
31803
|
+
const submitPromptAndScrollToBottom = useCallback46(
|
|
31268
31804
|
(content, displayPrompt, options) => {
|
|
31269
31805
|
requestSubmittedPromptScrollToBottom();
|
|
31270
31806
|
if (displayPrompt === void 0) {
|
|
@@ -31275,7 +31811,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31275
31811
|
},
|
|
31276
31812
|
[requestSubmittedPromptScrollToBottom, submitPrompt]
|
|
31277
31813
|
);
|
|
31278
|
-
const submitGuidancePromptAndScrollToBottom =
|
|
31814
|
+
const submitGuidancePromptAndScrollToBottom = useCallback46(
|
|
31279
31815
|
(content, displayPrompt) => {
|
|
31280
31816
|
requestSubmittedPromptScrollToBottom();
|
|
31281
31817
|
if (displayPrompt === void 0) {
|
|
@@ -31306,7 +31842,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31306
31842
|
);
|
|
31307
31843
|
const stableRequestGitBranches = useOptionalStableEventCallback(onRequestGitBranches);
|
|
31308
31844
|
const authLogin = useOptionalStableEventCallback(onAgentProviderLogin);
|
|
31309
|
-
const submitBottomDockInteractivePrompt =
|
|
31845
|
+
const submitBottomDockInteractivePrompt = useCallback46(
|
|
31310
31846
|
(input) => {
|
|
31311
31847
|
submitInteractivePrompt(input);
|
|
31312
31848
|
setBottomDockDismissedPromptRequestId(input.requestId);
|
|
@@ -31396,7 +31932,7 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31396
31932
|
providerSelectLabel: labels.providerSwitchLabel,
|
|
31397
31933
|
handoffLabel: labels.handoffConversation,
|
|
31398
31934
|
handoffMenuLabel: labels.handoffConversationMenu,
|
|
31399
|
-
isInterrupting: viewModel.composer.isInterrupting,
|
|
31935
|
+
isInterrupting: viewModel.composer.isInterrupting || viewModel.composer.isCancelPending,
|
|
31400
31936
|
isSendingTurn: isComposerSending,
|
|
31401
31937
|
isSubmittingPrompt: viewModel.interaction.isRespondingApproval,
|
|
31402
31938
|
uiLanguage,
|
|
@@ -31660,8 +32196,8 @@ var AgentGUIDetailPane = memo12(function AgentGUIDetailPane2({
|
|
|
31660
32196
|
});
|
|
31661
32197
|
|
|
31662
32198
|
// agent-gui/agentGuiNode/view/AgentGUIRenameConversationDialog.tsx
|
|
31663
|
-
import { memo as memo13, useCallback as
|
|
31664
|
-
import { ConfirmationDialog as ConfirmationDialog2 } from "@tutti-os/ui-system";
|
|
32199
|
+
import { memo as memo13, useCallback as useCallback47, useEffect as useEffect35, useRef as useRef40, useState as useState34 } from "react";
|
|
32200
|
+
import { ConfirmationDialog as ConfirmationDialog2, Input as Input2 } from "@tutti-os/ui-system";
|
|
31665
32201
|
import { jsx as jsx59, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
31666
32202
|
var AgentGUIRenameConversationDialog = memo13(
|
|
31667
32203
|
function AgentGUIRenameConversationDialog2({
|
|
@@ -31674,9 +32210,9 @@ var AgentGUIRenameConversationDialog = memo13(
|
|
|
31674
32210
|
"use memo";
|
|
31675
32211
|
const [title, setTitle] = useState34("");
|
|
31676
32212
|
const [isSaving, setIsSaving] = useState34(false);
|
|
31677
|
-
const isSavingRef =
|
|
31678
|
-
const armedPointerActionRef =
|
|
31679
|
-
const inputRef =
|
|
32213
|
+
const isSavingRef = useRef40(false);
|
|
32214
|
+
const armedPointerActionRef = useRef40(null);
|
|
32215
|
+
const inputRef = useRef40(null);
|
|
31680
32216
|
const trimmedTitle = title.trim();
|
|
31681
32217
|
useEffect35(() => {
|
|
31682
32218
|
if (!open || !conversation) {
|
|
@@ -31698,12 +32234,12 @@ var AgentGUIRenameConversationDialog = memo13(
|
|
|
31698
32234
|
}, 0);
|
|
31699
32235
|
return () => window.clearTimeout(timer);
|
|
31700
32236
|
}, [open, conversation?.id]);
|
|
31701
|
-
const closeRenameDialog =
|
|
32237
|
+
const closeRenameDialog = useCallback47(() => {
|
|
31702
32238
|
if (!isSavingRef.current) {
|
|
31703
32239
|
onOpenChange(false);
|
|
31704
32240
|
}
|
|
31705
32241
|
}, [onOpenChange]);
|
|
31706
|
-
const confirmRename =
|
|
32242
|
+
const confirmRename = useCallback47(() => {
|
|
31707
32243
|
if (!conversation || isSavingRef.current || !trimmedTitle) {
|
|
31708
32244
|
return;
|
|
31709
32245
|
}
|
|
@@ -31822,11 +32358,12 @@ var AgentGUIRenameConversationDialog = memo13(
|
|
|
31822
32358
|
onConfirm: confirmRename,
|
|
31823
32359
|
onOpenChange,
|
|
31824
32360
|
children: /* @__PURE__ */ jsx59(
|
|
31825
|
-
|
|
32361
|
+
Input2,
|
|
31826
32362
|
{
|
|
31827
32363
|
ref: inputRef,
|
|
31828
32364
|
"aria-label": labels.renameSessionTitle,
|
|
31829
|
-
className: "h-
|
|
32365
|
+
className: "h-9",
|
|
32366
|
+
variant: "md",
|
|
31830
32367
|
placeholder: labels.renameSessionPlaceholder,
|
|
31831
32368
|
value: title,
|
|
31832
32369
|
onChange: (event) => setTitle(event.currentTarget.value),
|
|
@@ -31904,7 +32441,7 @@ function AgentGUIReferencePickerSurface({
|
|
|
31904
32441
|
}
|
|
31905
32442
|
|
|
31906
32443
|
// agent-gui/agentGuiNode/view/useAgentGUIWorkspaceReferencePicker.ts
|
|
31907
|
-
import { useCallback as
|
|
32444
|
+
import { useCallback as useCallback48, useMemo as useMemo36, useRef as useRef41, useState as useState35 } from "react";
|
|
31908
32445
|
import { createRichTextMentionHref } from "@tutti-os/ui-rich-text/core";
|
|
31909
32446
|
function useAgentGUIWorkspaceReferencePicker(input) {
|
|
31910
32447
|
const {
|
|
@@ -31919,17 +32456,17 @@ function useAgentGUIWorkspaceReferencePicker(input) {
|
|
|
31919
32456
|
} = input;
|
|
31920
32457
|
const [workspaceReferencePickerOpen, setWorkspaceReferencePickerOpen] = useState35(false);
|
|
31921
32458
|
const [workspaceReferencePickerTarget, setWorkspaceReferencePickerTarget] = useState35(null);
|
|
31922
|
-
const workspaceReferencePickerResolverRef =
|
|
32459
|
+
const workspaceReferencePickerResolverRef = useRef41(null);
|
|
31923
32460
|
const emptyReferencePickResult = useMemo36(
|
|
31924
32461
|
() => ({ files: [], mentionItems: [] }),
|
|
31925
32462
|
[]
|
|
31926
32463
|
);
|
|
31927
32464
|
const hostLocalFileSourceId = "host-local-file";
|
|
31928
|
-
const isWorkspaceReferencePickerNodeSelectable =
|
|
32465
|
+
const isWorkspaceReferencePickerNodeSelectable = useCallback48(
|
|
31929
32466
|
(node) => node.ref.sourceId !== hostLocalFileSourceId || node.kind === "file",
|
|
31930
32467
|
[hostLocalFileSourceId]
|
|
31931
32468
|
);
|
|
31932
|
-
const requestWorkspaceReferences =
|
|
32469
|
+
const requestWorkspaceReferences = useCallback48(
|
|
31933
32470
|
async (entity) => {
|
|
31934
32471
|
if (previewMode) {
|
|
31935
32472
|
return emptyReferencePickResult;
|
|
@@ -31961,13 +32498,13 @@ function useAgentGUIWorkspaceReferencePicker(input) {
|
|
|
31961
32498
|
workspaceFileReferenceCopy
|
|
31962
32499
|
]
|
|
31963
32500
|
);
|
|
31964
|
-
const closeWorkspaceReferencePicker =
|
|
32501
|
+
const closeWorkspaceReferencePicker = useCallback48(() => {
|
|
31965
32502
|
workspaceReferencePickerResolverRef.current?.(emptyReferencePickResult);
|
|
31966
32503
|
workspaceReferencePickerResolverRef.current = null;
|
|
31967
32504
|
setWorkspaceReferencePickerOpen(false);
|
|
31968
32505
|
setWorkspaceReferencePickerTarget(null);
|
|
31969
32506
|
}, [emptyReferencePickResult]);
|
|
31970
|
-
const settleReferencePicker =
|
|
32507
|
+
const settleReferencePicker = useCallback48(
|
|
31971
32508
|
(result, addedFiles) => {
|
|
31972
32509
|
workspaceReferencePickerResolverRef.current?.(result);
|
|
31973
32510
|
workspaceReferencePickerResolverRef.current = null;
|
|
@@ -31979,13 +32516,13 @@ function useAgentGUIWorkspaceReferencePicker(input) {
|
|
|
31979
32516
|
},
|
|
31980
32517
|
[onWorkspaceFileReferencesAdded]
|
|
31981
32518
|
);
|
|
31982
|
-
const confirmWorkspaceReferencePicker =
|
|
32519
|
+
const confirmWorkspaceReferencePicker = useCallback48(
|
|
31983
32520
|
(refs) => {
|
|
31984
32521
|
settleReferencePicker({ files: refs, mentionItems: [] }, refs);
|
|
31985
32522
|
},
|
|
31986
32523
|
[settleReferencePicker]
|
|
31987
32524
|
);
|
|
31988
|
-
const confirmWorkspaceReferenceBundles =
|
|
32525
|
+
const confirmWorkspaceReferenceBundles = useCallback48(
|
|
31989
32526
|
(result) => {
|
|
31990
32527
|
const workspaceRefs = result.files.filter(
|
|
31991
32528
|
(ref) => ref.sourceId !== hostLocalFileSourceId
|
|
@@ -32034,7 +32571,7 @@ function useAgentGUIWorkspaceReferencePicker(input) {
|
|
|
32034
32571
|
}
|
|
32035
32572
|
|
|
32036
32573
|
// agent-gui/agentGuiNode/engagement/useAgentGUINodeEngagement.ts
|
|
32037
|
-
import { useRef as
|
|
32574
|
+
import { useRef as useRef43 } from "react";
|
|
32038
32575
|
|
|
32039
32576
|
// agent-gui/agentGuiNode/engagement/projectAgentGUIEngagementContext.ts
|
|
32040
32577
|
function projectAgentGUIEngagementContext(viewModel, composerReady) {
|
|
@@ -32066,7 +32603,7 @@ function createAgentGUIEngagementContextKey(input) {
|
|
|
32066
32603
|
}
|
|
32067
32604
|
|
|
32068
32605
|
// agent-gui/agentGuiNode/engagement/useAgentGUIPanelEngagement.ts
|
|
32069
|
-
import { useEffect as useEffect36, useRef as
|
|
32606
|
+
import { useEffect as useEffect36, useRef as useRef42 } from "react";
|
|
32070
32607
|
|
|
32071
32608
|
// agent-gui/agentGuiNode/engagement/AgentGUIPanelEngagementController.ts
|
|
32072
32609
|
var AGENT_GUI_PANEL_EXPOSURE_DWELL_MS = 1e3;
|
|
@@ -32220,10 +32757,10 @@ function documentIsVisible() {
|
|
|
32220
32757
|
|
|
32221
32758
|
// agent-gui/agentGuiNode/engagement/useAgentGUIPanelEngagement.ts
|
|
32222
32759
|
function useAgentGUIPanelEngagement(input) {
|
|
32223
|
-
const inputRef =
|
|
32224
|
-
const controllerRef =
|
|
32225
|
-
const intersectionRatioRef =
|
|
32226
|
-
const engagementRef =
|
|
32760
|
+
const inputRef = useRef42(input);
|
|
32761
|
+
const controllerRef = useRef42(null);
|
|
32762
|
+
const intersectionRatioRef = useRef42(0);
|
|
32763
|
+
const engagementRef = useRef42(null);
|
|
32227
32764
|
inputRef.current = input;
|
|
32228
32765
|
if (!engagementRef.current) {
|
|
32229
32766
|
engagementRef.current = {
|
|
@@ -32263,7 +32800,7 @@ function useAgentGUIPanelEngagement(input) {
|
|
|
32263
32800
|
|
|
32264
32801
|
// agent-gui/agentGuiNode/engagement/useAgentGUINodeEngagement.ts
|
|
32265
32802
|
function useAgentGUINodeEngagement(input) {
|
|
32266
|
-
const layoutElementRef =
|
|
32803
|
+
const layoutElementRef = useRef43(null);
|
|
32267
32804
|
const projected = projectAgentGUIEngagementContext(
|
|
32268
32805
|
input.viewModel,
|
|
32269
32806
|
input.composerReady
|
|
@@ -32352,7 +32889,7 @@ function AgentGUINodeView({
|
|
|
32352
32889
|
viewModel
|
|
32353
32890
|
});
|
|
32354
32891
|
const [providerManagerOpen, setProviderManagerOpen] = useState36(false);
|
|
32355
|
-
const railResizeInteractionRef =
|
|
32892
|
+
const railResizeInteractionRef = useRef44(null);
|
|
32356
32893
|
const [isRailResizing, setIsRailResizing] = useState36(false);
|
|
32357
32894
|
const [railResizeWidthPx, setRailResizeWidthPx] = useState36(
|
|
32358
32895
|
null
|
|
@@ -32361,7 +32898,7 @@ function AgentGUINodeView({
|
|
|
32361
32898
|
localComposerFocusRequestSequence,
|
|
32362
32899
|
setLocalComposerFocusRequestSequence
|
|
32363
32900
|
] = useState36(0);
|
|
32364
|
-
const handledNewConversationRequestSequenceRef =
|
|
32901
|
+
const handledNewConversationRequestSequenceRef = useRef44(
|
|
32365
32902
|
newConversationRequestSequence
|
|
32366
32903
|
);
|
|
32367
32904
|
const {
|
|
@@ -32411,10 +32948,10 @@ function AgentGUINodeView({
|
|
|
32411
32948
|
);
|
|
32412
32949
|
const openProjectFiles = useOptionalStableEventCallback(onLinkAction);
|
|
32413
32950
|
const detailComposerFocusRequestSequence = localComposerFocusRequestSequence === 0 ? composerFocusRequestSequence : (composerFocusRequestSequence ?? 0) + localComposerFocusRequestSequence;
|
|
32414
|
-
const requestComposerFocus =
|
|
32951
|
+
const requestComposerFocus = useCallback49(() => {
|
|
32415
32952
|
setLocalComposerFocusRequestSequence((current) => current + 1);
|
|
32416
32953
|
}, []);
|
|
32417
|
-
const requestCreateConversation =
|
|
32954
|
+
const requestCreateConversation = useCallback49(
|
|
32418
32955
|
(options) => {
|
|
32419
32956
|
if (previewMode) {
|
|
32420
32957
|
return;
|
|
@@ -32464,14 +33001,14 @@ function AgentGUINodeView({
|
|
|
32464
33001
|
workspaceAppIcons
|
|
32465
33002
|
]
|
|
32466
33003
|
);
|
|
32467
|
-
const clampConversationRailWidth =
|
|
33004
|
+
const clampConversationRailWidth = useCallback49(
|
|
32468
33005
|
(widthPx) => Math.min(
|
|
32469
33006
|
conversationRailMaxWidthPx,
|
|
32470
33007
|
Math.max(conversationRailMinWidthPx, widthPx)
|
|
32471
33008
|
),
|
|
32472
33009
|
[conversationRailMaxWidthPx, conversationRailMinWidthPx]
|
|
32473
33010
|
);
|
|
32474
|
-
const handleConversationRailResizePointerDown =
|
|
33011
|
+
const handleConversationRailResizePointerDown = useCallback49(
|
|
32475
33012
|
(event) => {
|
|
32476
33013
|
if (previewMode) {
|
|
32477
33014
|
return;
|
|
@@ -32492,7 +33029,7 @@ function AgentGUINodeView({
|
|
|
32492
33029
|
},
|
|
32493
33030
|
[conversationRailCollapsed, conversationRailWidthPx, previewMode]
|
|
32494
33031
|
);
|
|
32495
|
-
const handleConversationRailResizePointerMove =
|
|
33032
|
+
const handleConversationRailResizePointerMove = useCallback49(
|
|
32496
33033
|
(event) => {
|
|
32497
33034
|
if (previewMode) {
|
|
32498
33035
|
return;
|
|
@@ -32515,7 +33052,7 @@ function AgentGUINodeView({
|
|
|
32515
33052
|
},
|
|
32516
33053
|
[clampConversationRailWidth, previewMode]
|
|
32517
33054
|
);
|
|
32518
|
-
const endConversationRailResize =
|
|
33055
|
+
const endConversationRailResize = useCallback49(
|
|
32519
33056
|
(event) => {
|
|
32520
33057
|
const resizeState = railResizeInteractionRef.current;
|
|
32521
33058
|
if (event && resizeState?.pointerId === event.pointerId && event.currentTarget.hasPointerCapture?.(event.pointerId)) {
|
|
@@ -32546,7 +33083,7 @@ function AgentGUINodeView({
|
|
|
32546
33083
|
isRailResizing,
|
|
32547
33084
|
railResizeWidthPx
|
|
32548
33085
|
]);
|
|
32549
|
-
const handleConversationRailResizeKeyDown =
|
|
33086
|
+
const handleConversationRailResizeKeyDown = useCallback49(
|
|
32550
33087
|
(event) => {
|
|
32551
33088
|
if (previewMode) {
|
|
32552
33089
|
return;
|
|
@@ -32606,15 +33143,15 @@ function AgentGUINodeView({
|
|
|
32606
33143
|
(target) => target.disabled !== true && ((target.agentTargetId?.trim() ?? "") || (target.targetId?.trim() ?? ""))
|
|
32607
33144
|
);
|
|
32608
33145
|
const sectionAgentTargetFallbackId = enabledProviderTargets.length <= 1 ? viewModel.rail.selectedAgentTarget.agentTargetId?.trim() || viewModel.rail.selectedAgentTarget.targetId?.trim() || null : null;
|
|
32609
|
-
const openAgentEnvSetup =
|
|
33146
|
+
const openAgentEnvSetup = useCallback49(() => {
|
|
32610
33147
|
openAgentEnvPanel({ provider: effectiveRailConfigProvider, focus: null });
|
|
32611
33148
|
}, [effectiveRailConfigProvider]);
|
|
32612
|
-
const openAgentSettings =
|
|
33149
|
+
const openAgentSettings = useCallback49(() => {
|
|
32613
33150
|
openWorkspaceSettingsPanel({ section: "agent" });
|
|
32614
33151
|
}, []);
|
|
32615
33152
|
const [renameConversationTarget, setRenameConversationTarget] = useState36(null);
|
|
32616
33153
|
const [renameConversationDialogOpen, setRenameConversationDialogOpen] = useState36(false);
|
|
32617
|
-
const requestRenameConversation =
|
|
33154
|
+
const requestRenameConversation = useCallback49(
|
|
32618
33155
|
(conversation) => {
|
|
32619
33156
|
setRenameConversationTarget(conversation);
|
|
32620
33157
|
setRenameConversationDialogOpen(true);
|
|
@@ -33103,10 +33640,10 @@ function appendDockProbeUsageLines(probe, lines, isLoadingUsage, t) {
|
|
|
33103
33640
|
// agent-gui/workspaceDesktop/view/AgentProbeInfoPopover.tsx
|
|
33104
33641
|
import { Info as Info3 } from "lucide-react";
|
|
33105
33642
|
import {
|
|
33106
|
-
useCallback as
|
|
33643
|
+
useCallback as useCallback50,
|
|
33107
33644
|
useEffect as useEffect38,
|
|
33108
33645
|
useLayoutEffect as useLayoutEffect9,
|
|
33109
|
-
useRef as
|
|
33646
|
+
useRef as useRef45,
|
|
33110
33647
|
useState as useState37
|
|
33111
33648
|
} from "react";
|
|
33112
33649
|
import { createPortal as createPortal5 } from "react-dom";
|
|
@@ -33144,24 +33681,24 @@ function AgentProbeInfoPopover({
|
|
|
33144
33681
|
onOpen
|
|
33145
33682
|
}) {
|
|
33146
33683
|
"use memo";
|
|
33147
|
-
const anchorRef =
|
|
33148
|
-
const popoverRef =
|
|
33684
|
+
const anchorRef = useRef45(null);
|
|
33685
|
+
const popoverRef = useRef45(null);
|
|
33149
33686
|
const [isOpen, setIsOpen] = useState37(false);
|
|
33150
33687
|
const [popoverStyle, setPopoverStyle] = useState37(null);
|
|
33151
|
-
const openPopover =
|
|
33688
|
+
const openPopover = useCallback50(() => {
|
|
33152
33689
|
if (!isOpen) {
|
|
33153
33690
|
onOpen?.();
|
|
33154
33691
|
}
|
|
33155
33692
|
setIsOpen(true);
|
|
33156
33693
|
}, [isOpen, onOpen]);
|
|
33157
|
-
const closeIfPointerLeavesPopover =
|
|
33694
|
+
const closeIfPointerLeavesPopover = useCallback50((event) => {
|
|
33158
33695
|
const nextTarget = event.relatedTarget;
|
|
33159
33696
|
if (nextTarget instanceof Node && (anchorRef.current?.contains(nextTarget) || popoverRef.current?.contains(nextTarget))) {
|
|
33160
33697
|
return;
|
|
33161
33698
|
}
|
|
33162
33699
|
setIsOpen(false);
|
|
33163
33700
|
}, []);
|
|
33164
|
-
const updatePopoverPosition =
|
|
33701
|
+
const updatePopoverPosition = useCallback50(() => {
|
|
33165
33702
|
const anchor = anchorRef.current;
|
|
33166
33703
|
if (!anchor) {
|
|
33167
33704
|
return;
|
|
@@ -33801,6 +34338,10 @@ function useAgentGUIViewLabels(input) {
|
|
|
33801
34338
|
approvalRequired: t("agentHost.agentGui.approvalRequired", {
|
|
33802
34339
|
provider: displayProviderLabel
|
|
33803
34340
|
}),
|
|
34341
|
+
fileChangeApprovalRequired: t(
|
|
34342
|
+
"agentHost.agentGui.fileChangeApprovalRequired",
|
|
34343
|
+
{ provider: displayProviderLabel }
|
|
34344
|
+
),
|
|
33804
34345
|
approvalUnavailable: t("agentHost.agentGui.approvalUnavailable"),
|
|
33805
34346
|
authRequired: t("agentHost.agentGui.authRequired"),
|
|
33806
34347
|
authLogin: t("agentHost.agentGui.authLogin"),
|
|
@@ -34295,13 +34836,13 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34295
34836
|
() => typeof i18n?.t === "function" ? createWorkspaceFileManagerI18nRuntime(i18n) : null,
|
|
34296
34837
|
[i18n]
|
|
34297
34838
|
);
|
|
34298
|
-
const handleLinkAction =
|
|
34839
|
+
const handleLinkAction = useCallback51(
|
|
34299
34840
|
(action) => {
|
|
34300
34841
|
onLinkAction?.(action);
|
|
34301
34842
|
},
|
|
34302
34843
|
[onLinkAction]
|
|
34303
34844
|
);
|
|
34304
|
-
const handleAgentProviderLogin =
|
|
34845
|
+
const handleAgentProviderLogin = useCallback51(
|
|
34305
34846
|
(provider) => {
|
|
34306
34847
|
const resolvedProvider = normalizeAgentGUIProviderIdentity(provider);
|
|
34307
34848
|
onAgentProviderLogin?.(
|
|
@@ -34310,7 +34851,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34310
34851
|
},
|
|
34311
34852
|
[onAgentProviderLogin, state.provider]
|
|
34312
34853
|
);
|
|
34313
|
-
const handleWorkspaceFileReferencesAdded =
|
|
34854
|
+
const handleWorkspaceFileReferencesAdded = useCallback51(
|
|
34314
34855
|
(references) => {
|
|
34315
34856
|
onWorkspaceFileReferencesAdded?.({
|
|
34316
34857
|
provider: state.provider,
|
|
@@ -34319,7 +34860,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34319
34860
|
},
|
|
34320
34861
|
[onWorkspaceFileReferencesAdded, state.provider]
|
|
34321
34862
|
);
|
|
34322
|
-
const handleDataChange =
|
|
34863
|
+
const handleDataChange = useCallback51(
|
|
34323
34864
|
(updater) => {
|
|
34324
34865
|
if (previewMode) {
|
|
34325
34866
|
return;
|
|
@@ -34328,7 +34869,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34328
34869
|
},
|
|
34329
34870
|
[onUpdateNode, previewMode]
|
|
34330
34871
|
);
|
|
34331
|
-
const handleConversationRailWidthChanged =
|
|
34872
|
+
const handleConversationRailWidthChanged = useCallback51(
|
|
34332
34873
|
(widthPx) => {
|
|
34333
34874
|
if (previewMode) {
|
|
34334
34875
|
return;
|
|
@@ -34360,7 +34901,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34360
34901
|
}),
|
|
34361
34902
|
[]
|
|
34362
34903
|
);
|
|
34363
|
-
const toggleConversationRailCollapsed =
|
|
34904
|
+
const toggleConversationRailCollapsed = useCallback51(() => {
|
|
34364
34905
|
if (previewMode) {
|
|
34365
34906
|
return;
|
|
34366
34907
|
}
|
|
@@ -34369,7 +34910,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34369
34910
|
conversationRailCollapsed: current.conversationRailCollapsed !== true
|
|
34370
34911
|
}));
|
|
34371
34912
|
}, [onUpdateNode, previewMode]);
|
|
34372
|
-
const handleConversationRailToggle =
|
|
34913
|
+
const handleConversationRailToggle = useCallback51(() => {
|
|
34373
34914
|
if (previewMode) {
|
|
34374
34915
|
return;
|
|
34375
34916
|
}
|
|
@@ -34428,7 +34969,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34428
34969
|
onRememberComposerDefaults,
|
|
34429
34970
|
onShowMessage
|
|
34430
34971
|
});
|
|
34431
|
-
const handleCreateConversation =
|
|
34972
|
+
const handleCreateConversation = useCallback51(
|
|
34432
34973
|
(...args) => {
|
|
34433
34974
|
if (!previewMode) {
|
|
34434
34975
|
onUpdateNode(
|
|
@@ -34552,13 +35093,13 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34552
35093
|
previewMode,
|
|
34553
35094
|
railStatusProvider
|
|
34554
35095
|
]);
|
|
34555
|
-
const handleAgentProbeInfoOpen =
|
|
35096
|
+
const handleAgentProbeInfoOpen = useCallback51(() => {
|
|
34556
35097
|
if (previewMode || !onAgentProbeRefreshRequest) {
|
|
34557
35098
|
return;
|
|
34558
35099
|
}
|
|
34559
35100
|
onAgentProbeRefreshRequest(activeProbeProvider, `agent-gui:${nodeId}`);
|
|
34560
35101
|
}, [activeProbeProvider, nodeId, onAgentProbeRefreshRequest, previewMode]);
|
|
34561
|
-
const handleAgentConfigMenuOpen =
|
|
35102
|
+
const handleAgentConfigMenuOpen = useCallback51(() => {
|
|
34562
35103
|
if (previewMode || !onAgentProbeRefreshRequest) {
|
|
34563
35104
|
return;
|
|
34564
35105
|
}
|
|
@@ -34573,7 +35114,7 @@ var AgentGUINode = memo14(function AgentGUINode2({
|
|
|
34573
35114
|
previewMode,
|
|
34574
35115
|
railStatusProvider
|
|
34575
35116
|
]);
|
|
34576
|
-
const handleAgentUsageRefresh =
|
|
35117
|
+
const handleAgentUsageRefresh = useCallback51(() => {
|
|
34577
35118
|
if (previewMode || !onAgentProbeRefreshRequest) {
|
|
34578
35119
|
return;
|
|
34579
35120
|
}
|
|
@@ -34771,4 +35312,4 @@ export {
|
|
|
34771
35312
|
resolveAgentGUIAgentTarget,
|
|
34772
35313
|
AgentGUI
|
|
34773
35314
|
};
|
|
34774
|
-
//# sourceMappingURL=chunk-
|
|
35315
|
+
//# sourceMappingURL=chunk-KXZMIZ5H.js.map
|