@manta-eu/react 0.4.0 → 0.5.0
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/README.md +1 -0
- package/dist/components/chat-view/Chat.d.ts +20 -0
- package/dist/components/chat-view/Chat.d.ts.map +1 -1
- package/dist/components/chat-view/Chat.js +51 -15
- package/dist/components/chat-view/Chat.js.map +1 -1
- package/dist/components/embedded-chat/index.d.ts +1 -1
- package/dist/components/embedded-chat/index.d.ts.map +1 -1
- package/dist/components/embedded-chat/index.js +1 -1
- package/dist/components/embedded-chat/index.js.map +1 -1
- package/dist/components/planning/ActioningView.d.ts.map +1 -1
- package/dist/components/planning/ActioningView.js +1 -1
- package/dist/components/planning/ActioningView.js.map +1 -1
- package/dist/components/planning/ExecutionTopBar.d.ts +1 -0
- package/dist/components/planning/ExecutionTopBar.d.ts.map +1 -1
- package/dist/components/planning/ExecutionTopBar.js +3 -2
- package/dist/components/planning/ExecutionTopBar.js.map +1 -1
- package/dist/components/planning/plan-detail-utils.d.ts +1 -0
- package/dist/components/planning/plan-detail-utils.d.ts.map +1 -1
- package/dist/components/planning/plan-detail-utils.js +5 -2
- package/dist/components/planning/plan-detail-utils.js.map +1 -1
- package/dist/components/tool-invocation-card/ToolOutputRenderer.d.ts.map +1 -1
- package/dist/components/tool-invocation-card/ToolOutputRenderer.js +5 -2
- package/dist/components/tool-invocation-card/ToolOutputRenderer.js.map +1 -1
- package/dist/hooks/use-connection-problems.d.ts.map +1 -1
- package/dist/hooks/useValidateActionPlan.d.ts.map +1 -1
- package/dist/lib/chat-types.d.ts +17 -0
- package/dist/lib/chat-types.d.ts.map +1 -1
- package/dist/lib/chat-types.js.map +1 -1
- package/dist/providers/ChatManagerProvider.d.ts +7 -0
- package/dist/providers/ChatManagerProvider.d.ts.map +1 -1
- package/dist/providers/ChatManagerProvider.js +129 -16
- package/dist/providers/ChatManagerProvider.js.map +1 -1
- package/dist/providers/chat-connection-context.d.ts +4 -1
- package/dist/providers/chat-connection-context.d.ts.map +1 -1
- package/dist/providers/chat-connection-context.js.map +1 -1
- package/dist/providers/chat-connection-lifecycle.d.ts +1 -0
- package/dist/providers/chat-connection-lifecycle.d.ts.map +1 -1
- package/dist/providers/chat-connection-lifecycle.js.map +1 -1
- package/dist/providers/chat-socket-auth.d.ts +3 -1
- package/dist/providers/chat-socket-auth.d.ts.map +1 -1
- package/dist/providers/chat-socket-auth.js +27 -9
- package/dist/providers/chat-socket-auth.js.map +1 -1
- package/dist/providers/chat-startup-timing.d.ts +14 -0
- package/dist/providers/chat-startup-timing.d.ts.map +1 -0
- package/dist/providers/chat-startup-timing.js +72 -0
- package/dist/providers/chat-startup-timing.js.map +1 -0
- package/dist/routes/plans/components/ActionPlansTableColumns.d.ts.map +1 -1
- package/dist/routes/plans/components/ActionPlansTableColumns.js +3 -3
- package/dist/routes/plans/components/ActionPlansTableColumns.js.map +1 -1
- package/package.json +7 -7
- package/src/components/chat-view/Chat.tsx +62 -15
- package/src/components/embedded-chat/index.tsx +9 -2
- package/src/components/planning/ActioningView.tsx +1 -0
- package/src/components/planning/ExecutionTopBar.tsx +14 -2
- package/src/components/planning/plan-detail-utils.tsx +6 -2
- package/src/components/tool-invocation-card/ToolOutputRenderer.tsx +5 -2
- package/src/lib/chat-types.ts +18 -0
- package/src/providers/ChatManagerProvider.tsx +166 -15
- package/src/providers/chat-connection-context.ts +4 -0
- package/src/providers/chat-connection-lifecycle.ts +1 -0
- package/src/providers/chat-socket-auth.ts +31 -12
- package/src/providers/chat-startup-timing.ts +89 -0
- package/src/routes/plans/components/ActionPlansTableColumns.tsx +3 -2
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export function createChatStartupTimeline() {
|
|
2
|
+
return { startedAt: performance.now(), marks: {}, ticketAttempts: 0, socketAttempts: 0 };
|
|
3
|
+
}
|
|
4
|
+
const attemptEnds = {
|
|
5
|
+
"token-requested": "socket-open",
|
|
6
|
+
"ticket-requested": "socket-open",
|
|
7
|
+
"ticket-received": "socket-open",
|
|
8
|
+
"socket-enabled": "socket-open",
|
|
9
|
+
"chat-mounted": "interactive",
|
|
10
|
+
};
|
|
11
|
+
const measures = {
|
|
12
|
+
"ticket-requested": { name: "host-token", from: "token-requested" },
|
|
13
|
+
"ticket-received": { name: "ticket", from: "ticket-requested" },
|
|
14
|
+
"socket-open": { name: "socket", from: "socket-enabled" },
|
|
15
|
+
"chat-mounted": { name: "until-chat-mount", from: "start" },
|
|
16
|
+
"first-paint": { name: "until-first-paint", from: "chat-mounted" },
|
|
17
|
+
interactive: { name: "until-interactive", from: "chat-mounted" },
|
|
18
|
+
};
|
|
19
|
+
export function markChatStartup(timeline, phase) {
|
|
20
|
+
const attemptEnd = attemptEnds[phase];
|
|
21
|
+
if (timeline.marks[attemptEnd ?? phase] !== undefined)
|
|
22
|
+
return false;
|
|
23
|
+
const now = performance.now();
|
|
24
|
+
timeline.marks[phase] = now - timeline.startedAt;
|
|
25
|
+
if (phase === "chat-mounted")
|
|
26
|
+
delete timeline.marks["first-paint"];
|
|
27
|
+
if (phase === "token-requested")
|
|
28
|
+
timeline.ticketAttempts += 1;
|
|
29
|
+
if (phase === "socket-enabled")
|
|
30
|
+
timeline.socketAttempts += 1;
|
|
31
|
+
const measure = measures[phase];
|
|
32
|
+
const from = measure && (measure.from === "start" ? 0 : timeline.marks[measure.from]);
|
|
33
|
+
try {
|
|
34
|
+
performance.mark(`manta-chat:${phase}`);
|
|
35
|
+
if (measure && from !== undefined) {
|
|
36
|
+
performance.measure(`manta-chat:${measure.name}`, { start: timeline.startedAt + from, end: now });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch { }
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
function elapsed(from, to) {
|
|
43
|
+
return Math.max(0, Math.round(to - from));
|
|
44
|
+
}
|
|
45
|
+
export function chatStartupReport(timeline, input) {
|
|
46
|
+
const { marks } = timeline;
|
|
47
|
+
const socketOpen = marks["socket-open"];
|
|
48
|
+
const chatMounted = marks["chat-mounted"];
|
|
49
|
+
const firstPaint = marks["first-paint"];
|
|
50
|
+
const interactive = marks.interactive;
|
|
51
|
+
if (socketOpen === undefined || chatMounted === undefined || firstPaint === undefined || interactive === undefined) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const tokenRequested = marks["token-requested"];
|
|
55
|
+
const ticketRequested = marks["ticket-requested"];
|
|
56
|
+
const ticketReceived = marks["ticket-received"];
|
|
57
|
+
const ticketed = input.mode === "ticket" && ticketRequested !== undefined && ticketReceived !== undefined;
|
|
58
|
+
return {
|
|
59
|
+
...input,
|
|
60
|
+
...(ticketed && tokenRequested !== undefined ? { hostTokenMs: elapsed(tokenRequested, ticketRequested) } : {}),
|
|
61
|
+
...(ticketed
|
|
62
|
+
? { ticketMs: elapsed(ticketRequested, ticketReceived), ticketAttempts: Math.max(1, timeline.ticketAttempts) }
|
|
63
|
+
: {}),
|
|
64
|
+
socketMs: elapsed(marks["socket-enabled"] ?? 0, socketOpen),
|
|
65
|
+
socketAttempts: Math.max(1, timeline.socketAttempts),
|
|
66
|
+
chatMountMs: elapsed(0, chatMounted),
|
|
67
|
+
socketReadyAtOpen: socketOpen <= chatMounted,
|
|
68
|
+
firstPaintMs: elapsed(chatMounted, firstPaint),
|
|
69
|
+
interactiveMs: elapsed(chatMounted, interactive),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=chat-startup-timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-startup-timing.js","sourceRoot":"","sources":["../../src/providers/chat-startup-timing.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionPlansTableColumns.d.ts","sourceRoot":"","sources":["../../../../src/routes/plans/components/ActionPlansTableColumns.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"ActionPlansTableColumns.d.ts","sourceRoot":"","sources":["../../../../src/routes/plans/components/ActionPlansTableColumns.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAmBvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,KAAK,8BAA8B,GAAG;IACpC,aAAa,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,mBAAmB,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,SAAS,CAAC;IAC7D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC,CAAC;AAyDF,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,8BAA8B,GAAG,SAAS,CAAC,UAAU,CAAC,EAAE,CAuHxG"}
|
|
@@ -11,7 +11,7 @@ import { actionPlanColumnIds, actionPlanColumnLabels } from "./actionPlansTableC
|
|
|
11
11
|
import { Badge } from "#components/badge/index";
|
|
12
12
|
import { Button } from "#components/button/index";
|
|
13
13
|
import { Dropdown, DropdownContent, DropdownGroup, DropdownItem, DropdownTrigger } from "#components/dropdown/index";
|
|
14
|
-
import { formatIntegration, IntegrationIcon, integrationToChannel, isTerminalActionPlanState, planStateVariant, statusLabel, } from "#components/planning/plan-detail-utils";
|
|
14
|
+
import { formatIntegration, IntegrationIcon, integrationToChannel, isTerminalActionPlanState, needsApproval, planStateVariant, statusLabel, } from "#components/planning/plan-detail-utils";
|
|
15
15
|
import { Tooltip, TooltipContent, TooltipTrigger } from "#components/tooltip/index";
|
|
16
16
|
import { getPendingManualActions } from "#lib/manual-actions";
|
|
17
17
|
function getPlanName(plan) {
|
|
@@ -21,9 +21,9 @@ function planStateLabel(plan, pendingApprovalCount) {
|
|
|
21
21
|
return match({
|
|
22
22
|
state: plan.state,
|
|
23
23
|
hasCurrentFacts: plan.hasCurrentFacts,
|
|
24
|
-
|
|
24
|
+
needsApproval: needsApproval(plan.state, pendingApprovalCount),
|
|
25
25
|
})
|
|
26
|
-
.with({
|
|
26
|
+
.with({ needsApproval: true }, () => "Needs approval")
|
|
27
27
|
.with({ state: GQLActionPlanState.Draft, hasCurrentFacts: false }, () => "Not currently executable")
|
|
28
28
|
.with({ state: GQLActionPlanState.Draft }, () => "Ready to launch")
|
|
29
29
|
.otherwise(({ state: matchedState }) => statusLabel(matchedState));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionPlansTableColumns.js","sourceRoot":"","sources":["../../../../src/routes/plans/components/ActionPlansTableColumns.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvF,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AACrH,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EACzB,gBAAgB,EAChB,WAAW,GACZ,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAQ9D,SAAS,WAAW,CAAC,IAAgB;IACnC,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnC,CAAC;AAED,SAAS,cAAc,CAAC,IAAgB,EAAE,oBAA4B;IACpE,OAAO,KAAK,CAAC;QACX,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,
|
|
1
|
+
{"version":3,"file":"ActionPlansTableColumns.js","sourceRoot":"","sources":["../../../../src/routes/plans/components/ActionPlansTableColumns.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@manta-eu/react",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "The Manta design system, knowledge-graph UI and agent components",
|
|
5
5
|
"homepage": "https://developers.manta.eu",
|
|
6
6
|
"keywords": [
|
|
@@ -1134,12 +1134,12 @@
|
|
|
1134
1134
|
"usehooks-ts": "^3.1.1",
|
|
1135
1135
|
"zod": "^4.5.0",
|
|
1136
1136
|
"zustand": "^5.0.2",
|
|
1137
|
-
"@manta-eu/auth": "0.
|
|
1138
|
-
"@manta-eu/
|
|
1139
|
-
"@manta-eu/
|
|
1140
|
-
"@manta-eu/ldo": "0.
|
|
1141
|
-
"@manta-eu/
|
|
1142
|
-
"@manta-eu/
|
|
1137
|
+
"@manta-eu/auth": "0.5.0",
|
|
1138
|
+
"@manta-eu/datalog-parser": "0.5.0",
|
|
1139
|
+
"@manta-eu/client": "0.5.0",
|
|
1140
|
+
"@manta-eu/ldo": "0.5.0",
|
|
1141
|
+
"@manta-eu/lib": "0.5.0",
|
|
1142
|
+
"@manta-eu/rdf-lib": "0.5.0"
|
|
1143
1143
|
},
|
|
1144
1144
|
"peerDependencies": {
|
|
1145
1145
|
"@ulb-darmstadt/shacl-form": "^2.1.1-rc1",
|
|
@@ -78,9 +78,12 @@ export type ChatProps = {
|
|
|
78
78
|
renderMenuItems?: (defaults: CopilotMenuDefaults) => ReactNode[];
|
|
79
79
|
};
|
|
80
80
|
|
|
81
|
-
function useChatTurnState() {
|
|
82
|
-
const
|
|
81
|
+
export function useChatTurnState() {
|
|
82
|
+
const { activeConversation, pendingMessage } = useChatManagerConnection();
|
|
83
|
+
const activeConversationId = activeConversation?.id;
|
|
84
|
+
const pendingMessageId = pendingMessage?.id;
|
|
83
85
|
const previousActiveConversationIdRef = useRef(activeConversationId);
|
|
86
|
+
const previousPendingMessageIdRef = useRef(pendingMessageId);
|
|
84
87
|
const [thinkingSeconds, setThinkingSeconds] = useState(0);
|
|
85
88
|
const [pendingAssistantTurn, setPendingAssistantTurn] = useState(false);
|
|
86
89
|
const turnKeyRef = useRef(0);
|
|
@@ -101,6 +104,13 @@ function useChatTurnState() {
|
|
|
101
104
|
}
|
|
102
105
|
}, [activeConversationId, resetChatTurn]);
|
|
103
106
|
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
const previousPendingMessageId = previousPendingMessageIdRef.current;
|
|
109
|
+
previousPendingMessageIdRef.current = pendingMessageId;
|
|
110
|
+
|
|
111
|
+
if (previousPendingMessageId && !pendingMessageId && !activeConversationId) resetChatTurn();
|
|
112
|
+
}, [activeConversationId, pendingMessageId, resetChatTurn]);
|
|
113
|
+
|
|
104
114
|
return {
|
|
105
115
|
activeTurnKey,
|
|
106
116
|
pendingAssistantTurn,
|
|
@@ -115,6 +125,19 @@ function useChatTurnState() {
|
|
|
115
125
|
|
|
116
126
|
type ChatTurnState = ReturnType<typeof useChatTurnState>;
|
|
117
127
|
|
|
128
|
+
export function useInitialPrompt(initialPrompt: string | undefined, submit: (prompt: string) => void) {
|
|
129
|
+
const { activeConversation, isConversationLoading } = useChatManagerConnection();
|
|
130
|
+
const sentRef = useRef<string | undefined>(undefined);
|
|
131
|
+
|
|
132
|
+
useEffect(() => {
|
|
133
|
+
if (!isPresent(initialPrompt) || sentRef.current === initialPrompt) return;
|
|
134
|
+
if (isConversationLoading || isPresent(activeConversation)) return;
|
|
135
|
+
|
|
136
|
+
sentRef.current = initialPrompt;
|
|
137
|
+
submit(initialPrompt);
|
|
138
|
+
}, [initialPrompt, isConversationLoading, activeConversation, submit]);
|
|
139
|
+
}
|
|
140
|
+
|
|
118
141
|
export function Chat(props: ChatProps) {
|
|
119
142
|
const turnState = useChatTurnState();
|
|
120
143
|
const content = <ChatContent {...props} turnState={turnState} />;
|
|
@@ -170,6 +193,21 @@ export function getChatWelcomeContent(args: ChatWelcomeArgs): ChatWelcomeContent
|
|
|
170
193
|
.exhaustive();
|
|
171
194
|
}
|
|
172
195
|
|
|
196
|
+
export type ChatConnectingArgs = {
|
|
197
|
+
hasPendingMessage: boolean;
|
|
198
|
+
isConversationLoading: boolean;
|
|
199
|
+
isBlankChat: boolean;
|
|
200
|
+
hasMessages: boolean;
|
|
201
|
+
isSocketOpen: boolean;
|
|
202
|
+
isTranscriptSynced: boolean;
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
export function chatIsConnectingOrSyncing(args: ChatConnectingArgs): boolean {
|
|
206
|
+
if (args.hasPendingMessage) return false;
|
|
207
|
+
if (args.isConversationLoading) return true;
|
|
208
|
+
return !args.isBlankChat && !args.hasMessages && (!args.isSocketOpen || !args.isTranscriptSynced);
|
|
209
|
+
}
|
|
210
|
+
|
|
173
211
|
function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
174
212
|
const {
|
|
175
213
|
datastore,
|
|
@@ -223,8 +261,8 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
223
261
|
startNewChat,
|
|
224
262
|
activeConversation,
|
|
225
263
|
isConversationLoading,
|
|
226
|
-
connectionState,
|
|
227
264
|
sendNewConversationMessage,
|
|
265
|
+
markStartup,
|
|
228
266
|
} = useChatManagerConnection();
|
|
229
267
|
const activeChat = useActiveChatConnection();
|
|
230
268
|
const agent = activeChat?.agent ?? managerAgent;
|
|
@@ -248,10 +286,14 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
248
286
|
const hasPendingQuestionnaire =
|
|
249
287
|
latestMessage?.role === "assistant" && latestMessage.parts.some(isPendingRequestUserInputPart);
|
|
250
288
|
const isTranscriptSynced = activeChat?.isTranscriptSynced ?? !activeConversation?.id;
|
|
251
|
-
const isConnectingOrSyncing =
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
289
|
+
const isConnectingOrSyncing = chatIsConnectingOrSyncing({
|
|
290
|
+
hasPendingMessage,
|
|
291
|
+
isConversationLoading,
|
|
292
|
+
isBlankChat: !isPresent(activeConversation) && !isPresent(selectedContext),
|
|
293
|
+
hasMessages: isPresent(agentMessages),
|
|
294
|
+
isSocketOpen: agent.readyState === WebSocket.OPEN,
|
|
295
|
+
isTranscriptSynced,
|
|
296
|
+
});
|
|
255
297
|
const isSessionConnecting = Boolean(activeConversation?.id) && (agent.readyState !== WebSocket.OPEN || !agentState);
|
|
256
298
|
|
|
257
299
|
const addToolResult = chatData?.addToolResult;
|
|
@@ -279,7 +321,6 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
279
321
|
.otherwise(({ status }) => status);
|
|
280
322
|
|
|
281
323
|
const toolsUsedInSession = useRef(new Set<string>());
|
|
282
|
-
const initialPromptSentRef = useRef<string | undefined>(undefined);
|
|
283
324
|
|
|
284
325
|
const { uploadFiles, isUploading, progress: uploadProgress } = useChatUpload();
|
|
285
326
|
|
|
@@ -344,13 +385,7 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
344
385
|
[handleAgentSubmit],
|
|
345
386
|
);
|
|
346
387
|
|
|
347
|
-
|
|
348
|
-
if (!isPresent(initialPrompt) || initialPromptSentRef.current === initialPrompt) return;
|
|
349
|
-
if (connectionState !== "open" || isConversationLoading || isPresent(activeConversation)) return;
|
|
350
|
-
|
|
351
|
-
initialPromptSentRef.current = initialPrompt;
|
|
352
|
-
handleConversationStarterSubmit(initialPrompt);
|
|
353
|
-
}, [initialPrompt, connectionState, isConversationLoading, activeConversation, handleConversationStarterSubmit]);
|
|
388
|
+
useInitialPrompt(initialPrompt, handleConversationStarterSubmit);
|
|
354
389
|
|
|
355
390
|
const handleRetryTurn = useCallback(async () => {
|
|
356
391
|
if (!chatData?.regenerate) return;
|
|
@@ -397,6 +432,18 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
397
432
|
const pendingAssistantMessageId = activeTurnKey ?? latestMessage?.id;
|
|
398
433
|
const needsPendingPlaceholder = isAwaitingAssistant && latestMessage?.role !== "assistant";
|
|
399
434
|
|
|
435
|
+
useEffect(() => {
|
|
436
|
+
markStartup("chat-mounted");
|
|
437
|
+
}, [markStartup]);
|
|
438
|
+
|
|
439
|
+
useEffect(() => {
|
|
440
|
+
if (!isConnectingOrSyncing) markStartup("first-paint");
|
|
441
|
+
}, [isConnectingOrSyncing, markStartup]);
|
|
442
|
+
|
|
443
|
+
useEffect(() => {
|
|
444
|
+
if (!isConnectingOrSyncing && !isComposerBusy) markStartup("interactive");
|
|
445
|
+
}, [isConnectingOrSyncing, isComposerBusy, markStartup]);
|
|
446
|
+
|
|
400
447
|
const displayMessages = useMemo(() => {
|
|
401
448
|
if (!needsPendingPlaceholder || !pendingAssistantMessageId) return agentMessages;
|
|
402
449
|
const placeholder: ChatUIMessage = {
|
|
@@ -13,7 +13,7 @@ import { KnowledgeGraphStateProvider } from "#providers/KnowledgeGraphStateProvi
|
|
|
13
13
|
import { useMantaClient } from "#providers/MantaClientProvider";
|
|
14
14
|
import { ActionPlansPage, PlanDetailRouteContent, useActionPlanRouteState } from "#routes/plans/index";
|
|
15
15
|
|
|
16
|
-
export type { ChatDraft } from "#lib/chat-types";
|
|
16
|
+
export type { ChatDraft, ChatStartupReport } from "#lib/chat-types";
|
|
17
17
|
|
|
18
18
|
export function EmbeddedChat(props: AuthenticatedChatProps) {
|
|
19
19
|
const inRouter = useInRouterContext();
|
|
@@ -86,7 +86,14 @@ function EmbeddedContent(props: ResolvedChatProps) {
|
|
|
86
86
|
}
|
|
87
87
|
|
|
88
88
|
return (
|
|
89
|
-
<ChatManagerProvider
|
|
89
|
+
<ChatManagerProvider
|
|
90
|
+
key={`${datastoreId ?? ""}:${props.mode ?? "datastore"}`}
|
|
91
|
+
datastoreId={datastoreId}
|
|
92
|
+
mode={props.mode}
|
|
93
|
+
onSelectPlan={onSelectPlan}
|
|
94
|
+
surface="embedded"
|
|
95
|
+
onStartupTiming={props.onStartupTiming}
|
|
96
|
+
>
|
|
90
97
|
<KnowledgeGraphStateProvider datastoreId={datastoreId}>
|
|
91
98
|
<KnowledgeGraphStartupGate embedded>
|
|
92
99
|
<Chat
|
|
@@ -149,6 +149,7 @@ export function ActioningView(props: ActioningViewProps) {
|
|
|
149
149
|
<ExecutionTopBar
|
|
150
150
|
planName={planName}
|
|
151
151
|
status={executionStatus}
|
|
152
|
+
pendingManualActionCount={pendingManualActionCount}
|
|
152
153
|
workflowId={workflowId}
|
|
153
154
|
triggerError={triggerError}
|
|
154
155
|
onExecute={onExecute}
|
|
@@ -6,6 +6,7 @@ import { cn } from "#lib/utils";
|
|
|
6
6
|
type ExecutionTopBarProps = {
|
|
7
7
|
planName: string;
|
|
8
8
|
status: ExecutionStatus;
|
|
9
|
+
pendingManualActionCount: number;
|
|
9
10
|
workflowId: string | null;
|
|
10
11
|
triggerError: string | null;
|
|
11
12
|
onExecute?: (dryRun: boolean) => void;
|
|
@@ -38,8 +39,19 @@ const statusConfig: Record<
|
|
|
38
39
|
};
|
|
39
40
|
|
|
40
41
|
export function ExecutionTopBar(props: ExecutionTopBarProps) {
|
|
41
|
-
const {
|
|
42
|
-
|
|
42
|
+
const {
|
|
43
|
+
planName,
|
|
44
|
+
status,
|
|
45
|
+
pendingManualActionCount,
|
|
46
|
+
onExecute,
|
|
47
|
+
onRerun,
|
|
48
|
+
isExecuteDialogOpen,
|
|
49
|
+
onExecuteDialogOpenChange,
|
|
50
|
+
isDryRun,
|
|
51
|
+
} = props;
|
|
52
|
+
|
|
53
|
+
const shownStatus = status === "completed" && !isDryRun && pendingManualActionCount > 0 ? "needs-approval" : status;
|
|
54
|
+
const config = statusConfig[shownStatus];
|
|
43
55
|
const isTerminal = status === "completed" || status === "failed";
|
|
44
56
|
const displayLabel = (isDryRun && config.dryRunLabel) || config.label;
|
|
45
57
|
|
|
@@ -77,10 +77,14 @@ export function statusLabel(status: ActionPlanStatus): string {
|
|
|
77
77
|
.exhaustive();
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
export function needsApproval(state: ActionPlanStatus, pendingApprovalCount: number): boolean {
|
|
81
|
+
return pendingApprovalCount > 0 && (state === GQLActionPlanState.Running || state === GQLActionPlanState.Completed);
|
|
82
|
+
}
|
|
83
|
+
|
|
80
84
|
export function planStateVariant(state: ActionPlanStatus, pendingApprovalCount = 0): BadgeVariant {
|
|
81
|
-
return match({ state,
|
|
85
|
+
return match({ state, needsApproval: needsApproval(state, pendingApprovalCount) })
|
|
82
86
|
.returnType<BadgeVariant>()
|
|
83
|
-
.with({
|
|
87
|
+
.with({ needsApproval: true }, () => "warning")
|
|
84
88
|
.with({ state: GQLActionPlanState.Running }, () => "info")
|
|
85
89
|
.with({ state: GQLActionPlanState.Completed }, () => "success")
|
|
86
90
|
.with({ state: GQLActionPlanState.Failed }, () => "destructive")
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { withChatModeQueryParam } from "@manta-eu/client/shared/chat-manager";
|
|
1
2
|
import { withDatastoreQueryParam } from "@manta-eu/client/shared/datastore-path";
|
|
2
3
|
import { isShowEntitiesResult } from "@manta-eu/client/shared/tools";
|
|
3
4
|
import {
|
|
@@ -5,7 +6,7 @@ import {
|
|
|
5
6
|
type WorkspaceArtifact,
|
|
6
7
|
} from "@manta-eu/client/shared/workspace-artifacts";
|
|
7
8
|
import type { ToolUIPart } from "ai";
|
|
8
|
-
import { useCallback } from "react";
|
|
9
|
+
import { useCallback, useContext } from "react";
|
|
9
10
|
import { match } from "ts-pattern";
|
|
10
11
|
import { FileMessagePart } from "../chat-view/FileMessagePart";
|
|
11
12
|
import { ActionPlanShowcaseCard } from "./ActionPlanShowcaseCard";
|
|
@@ -45,6 +46,7 @@ import {
|
|
|
45
46
|
} from "#components/chart/index";
|
|
46
47
|
import { decodeChartEntities } from "#lib/decode-chart-entities";
|
|
47
48
|
import { cn } from "#lib/utils";
|
|
49
|
+
import { ChatManagerContext } from "#providers/chat-connection-context";
|
|
48
50
|
import { useChatManagerConnection } from "#providers/ChatManagerProvider";
|
|
49
51
|
import { useMantaClient } from "#providers/MantaClientProvider";
|
|
50
52
|
|
|
@@ -129,12 +131,13 @@ function WorkspaceArtifactResultDisplay(props: WorkspaceArtifactResultDisplayPro
|
|
|
129
131
|
const { result } = props;
|
|
130
132
|
|
|
131
133
|
const { datastoreId } = useMantaClient();
|
|
134
|
+
const mode = useContext(ChatManagerContext)?.managerConnection.mode;
|
|
132
135
|
|
|
133
136
|
return (
|
|
134
137
|
<FileMessagePart
|
|
135
138
|
part={{
|
|
136
139
|
type: "file",
|
|
137
|
-
url: withDatastoreQueryParam(result.url, datastoreId),
|
|
140
|
+
url: withChatModeQueryParam(withDatastoreQueryParam(result.url, datastoreId), mode),
|
|
138
141
|
mediaType: result.mediaType,
|
|
139
142
|
filename: result.filename,
|
|
140
143
|
}}
|
package/src/lib/chat-types.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* eslint-disable import/order -- each type is imported beside the re-export it exists for, which is
|
|
2
2
|
how this file is organized; they are type-only, so the positions have no runtime meaning. */
|
|
3
|
+
import type { ConversationMode } from "@manta-eu/client/shared/chat-manager";
|
|
3
4
|
import type { MantaModelId } from "@manta-eu/client/shared/model";
|
|
4
5
|
import type { ReactNode } from "react";
|
|
5
6
|
import type { Datastore } from "#ldo-ui";
|
|
@@ -26,6 +27,21 @@ export type CopilotMenuDefaults = {
|
|
|
26
27
|
|
|
27
28
|
export type ChatDraft = { id: string; text: string };
|
|
28
29
|
|
|
30
|
+
export type ChatStartupReport = {
|
|
31
|
+
surface: "embedded" | "app";
|
|
32
|
+
mode: "ticket" | "cookie";
|
|
33
|
+
openIndex: number;
|
|
34
|
+
hostTokenMs?: number;
|
|
35
|
+
ticketMs?: number;
|
|
36
|
+
ticketAttempts?: number;
|
|
37
|
+
socketMs: number;
|
|
38
|
+
socketAttempts: number;
|
|
39
|
+
chatMountMs: number;
|
|
40
|
+
socketReadyAtOpen: boolean;
|
|
41
|
+
firstPaintMs: number;
|
|
42
|
+
interactiveMs: number;
|
|
43
|
+
};
|
|
44
|
+
|
|
29
45
|
// NOTE: Adding to this is a breaking change to library clients
|
|
30
46
|
export type AuthenticatedChatProps = {
|
|
31
47
|
datastore?: Datastore;
|
|
@@ -39,6 +55,7 @@ export type AuthenticatedChatProps = {
|
|
|
39
55
|
collapsible?: boolean;
|
|
40
56
|
isCollapsed?: boolean;
|
|
41
57
|
pageContext?: PageContext;
|
|
58
|
+
mode?: ConversationMode;
|
|
42
59
|
allowedModels?: MantaModelId[];
|
|
43
60
|
initialPrompt?: string;
|
|
44
61
|
initialDraft?: ChatDraft;
|
|
@@ -48,6 +65,7 @@ export type AuthenticatedChatProps = {
|
|
|
48
65
|
assistantIcon?: AssistantIcon;
|
|
49
66
|
mark?: ReactNode;
|
|
50
67
|
renderMenuItems?: (defaults: CopilotMenuDefaults) => ReactNode[];
|
|
68
|
+
onStartupTiming?: (report: ChatStartupReport) => void;
|
|
51
69
|
};
|
|
52
70
|
|
|
53
71
|
export type ResolvedChatProps = AuthenticatedChatProps & {
|