@manta-eu/react 0.4.0 → 0.5.1
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 +27 -1
- package/dist/components/chat-view/Chat.d.ts.map +1 -1
- package/dist/components/chat-view/Chat.js +76 -18
- 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/layouts/Sidebar.d.ts.map +1 -1
- package/dist/components/layouts/Sidebar.js +4 -2
- package/dist/components/layouts/Sidebar.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/sidebar/nav-user.js +1 -1
- package/dist/components/sidebar/nav-user.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/explain-fact/rule-presentation.d.ts.map +1 -1
- package/dist/explain-fact/rule-presentation.js +1 -6
- package/dist/explain-fact/rule-presentation.js.map +1 -1
- package/dist/explain-fact/tree-model.d.ts +2 -1
- package/dist/explain-fact/tree-model.d.ts.map +1 -1
- package/dist/explain-fact/tree-model.js +17 -2
- package/dist/explain-fact/tree-model.js.map +1 -1
- package/dist/hooks/use-connection-problems.d.ts.map +1 -1
- package/dist/hooks/use-manual-actions.js +1 -1
- package/dist/hooks/use-manual-actions.js.map +1 -1
- package/dist/hooks/useAuth.d.ts +1 -0
- package/dist/hooks/useAuth.d.ts.map +1 -1
- package/dist/hooks/useAuth.js +2 -1
- package/dist/hooks/useAuth.js.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/lib/datastore-route-table.d.ts +1 -0
- package/dist/lib/datastore-route-table.d.ts.map +1 -1
- package/dist/lib/datastore-route-table.js +1 -0
- package/dist/lib/datastore-route-table.js.map +1 -1
- package/dist/providers/AuthContext.d.ts +1 -0
- package/dist/providers/AuthContext.d.ts.map +1 -1
- package/dist/providers/AuthContext.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 +122 -20
- package/src/components/embedded-chat/index.tsx +9 -2
- package/src/components/layouts/Sidebar.tsx +3 -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/sidebar/nav-user.tsx +1 -1
- package/src/components/tool-invocation-card/ToolOutputRenderer.tsx +5 -2
- package/src/explain-fact/rule-presentation.ts +1 -6
- package/src/explain-fact/tree-model.ts +23 -1
- package/src/hooks/use-manual-actions.ts +1 -1
- package/src/hooks/useAuth.ts +3 -1
- package/src/lib/chat-types.ts +18 -0
- package/src/lib/datastore-route-table.ts +2 -0
- package/src/providers/AuthContext.ts +1 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-connection-lifecycle.js","sourceRoot":"","sources":["../../src/providers/chat-connection-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC,MAAM,UAAU,yBAAyB,CAAC,KAGzC;IACC,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IAEpD,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;SAC3B,UAAU,EAAmB;SAC7B,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC;SAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC;SAClC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;SACxC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC;SAC1C,SAAS,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAIC,EACD,YAAqB;IAErB,OAAO,KAAK,CAAC,KAAK,CAAC;SAChB,UAAU,EAAyC;SACnD,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC;SACpE,IAAI,CACH,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,eAAe,KAAK,IAAI,EACjD,GAAG,EAAE,CAAC,QAAQ,CACf;SACA,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAClE,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-connection-lifecycle.js","sourceRoot":"","sources":["../../src/providers/chat-connection-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC,MAAM,UAAU,yBAAyB,CAAC,KAGzC;IACC,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI;QAAE,OAAO,QAAQ,CAAC;IAEpD,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC;SAC3B,UAAU,EAAmB;SAC7B,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC;SAC9C,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC;SAClC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;SACxC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC;SAC1C,SAAS,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAIC,EACD,YAAqB;IAErB,OAAO,KAAK,CAAC,KAAK,CAAC;SAChB,UAAU,EAAyC;SACnD,IAAI,CAAC,EAAE,UAAU,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC;SACpE,IAAI,CACH,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,eAAe,KAAK,IAAI,EACjD,GAAG,EAAE,CAAC,QAAQ,CACf;SACA,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AAClE,CAAC;AASD,MAAM,UAAU,gCAAgC;IAC9C,OAAO;QACL,cAAc,EAAE,WAAW,MAAM,CAAC,UAAU,EAAE,EAAE;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ChatSocketAuthPhase } from "./chat-startup-timing.js";
|
|
1
2
|
export type ChatSocketAuth = {
|
|
2
3
|
query: Record<string, string>;
|
|
3
4
|
credentials: "include";
|
|
@@ -7,11 +8,12 @@ export type ChatSocketAuth = {
|
|
|
7
8
|
shouldReconnectOnClose: (event: CloseEvent) => boolean;
|
|
8
9
|
credentials: "omit";
|
|
9
10
|
};
|
|
11
|
+
export declare function isRequestedClose(event: CloseEvent): boolean;
|
|
10
12
|
/**
|
|
11
13
|
* A ticket is spent on its first connect, and partysocket would reconnect to the same URL, so the socket never
|
|
12
14
|
* reconnects by itself: each connect waits for a new ticket, and a dropped socket asks for one.
|
|
13
15
|
*/
|
|
14
|
-
export declare function useChatSocketAuth(datastoreQuery: Record<string, string
|
|
16
|
+
export declare function useChatSocketAuth(datastoreQuery: Record<string, string>, onPhase?: (phase: ChatSocketAuthPhase) => void): ChatSocketAuth;
|
|
15
17
|
type ChatTokenRefreshAgent = {
|
|
16
18
|
call: (method: string, args: unknown[]) => Promise<unknown>;
|
|
17
19
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-socket-auth.d.ts","sourceRoot":"","sources":["../../src/providers/chat-socket-auth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat-socket-auth.d.ts","sourceRoot":"","sources":["../../src/providers/chat-socket-auth.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAUjE,MAAM,MAAM,cAAc,GACtB;IAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,WAAW,EAAE,SAAS,CAAA;CAAE,GACzD;IACE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;IACvD,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AAUN,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAG3D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAC7C,cAAc,CA+FhB;AAED,KAAK,qBAAqB,GAAG;IAAE,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,CAAC;AAG7F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAqBtE"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { bearerFetch } from "@manta-eu/client";
|
|
2
|
+
import { chatModeQueryParam, chatTicketPath, chatTicketQueryParam } from "@manta-eu/client/shared/chat-manager";
|
|
2
3
|
import { datastoreHeader, datastoreQueryParam } from "@manta-eu/client/shared/datastore-path";
|
|
3
4
|
import { isPresent } from "@manta-eu/lib/present";
|
|
4
5
|
import { isTerminalCloseEvent } from "agents/client";
|
|
5
6
|
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
6
|
-
import { providerFetch } from "./manta-client-context.js";
|
|
7
7
|
import { useMantaClient } from "./MantaClientProvider.js";
|
|
8
8
|
const tokenRefreshCheckMs = 30_000;
|
|
9
9
|
const reconnectDelaysMs = [0, 1_000, 2_000, 5_000, 10_000];
|
|
@@ -17,7 +17,7 @@ function ticketFrom(body) {
|
|
|
17
17
|
return typeof body.ticket === "string" ? body.ticket : undefined;
|
|
18
18
|
}
|
|
19
19
|
// partysocket clears shouldReconnect before a close it was asked for: an unmount, or a socket being replaced.
|
|
20
|
-
function isRequestedClose(event) {
|
|
20
|
+
export function isRequestedClose(event) {
|
|
21
21
|
const target = event.target;
|
|
22
22
|
return typeof target === "object" && target !== null && "shouldReconnect" in target && !target.shouldReconnect;
|
|
23
23
|
}
|
|
@@ -25,12 +25,13 @@ function isRequestedClose(event) {
|
|
|
25
25
|
* A ticket is spent on its first connect, and partysocket would reconnect to the same URL, so the socket never
|
|
26
26
|
* reconnects by itself: each connect waits for a new ticket, and a dropped socket asks for one.
|
|
27
27
|
*/
|
|
28
|
-
export function useChatSocketAuth(datastoreQuery) {
|
|
28
|
+
export function useChatSocketAuth(datastoreQuery, onPhase) {
|
|
29
29
|
const client = useMantaClient();
|
|
30
30
|
const { getAccessToken, mantaBaseUrl } = client;
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const onPhaseRef = useRef(onPhase);
|
|
32
|
+
onPhaseRef.current = onPhase;
|
|
33
|
+
const getAccessTokenRef = useRef(getAccessToken);
|
|
34
|
+
getAccessTokenRef.current = getAccessToken;
|
|
34
35
|
const hasAccessToken = getAccessToken !== undefined;
|
|
35
36
|
const datastoreKey = JSON.stringify(datastoreQuery);
|
|
36
37
|
const datastoreQueryRef = useRef(datastoreQuery);
|
|
@@ -55,8 +56,24 @@ export function useChatSocketAuth(datastoreQuery) {
|
|
|
55
56
|
const delay = reconnectDelaysMs[Math.min(Math.max(drops.current.count - 1, 0), reconnectDelaysMs.length - 1)];
|
|
56
57
|
const timer = setTimeout(() => {
|
|
57
58
|
const query = datastoreQueryRef.current;
|
|
58
|
-
|
|
59
|
-
|
|
59
|
+
const getToken = getAccessTokenRef.current;
|
|
60
|
+
if (!getToken)
|
|
61
|
+
return;
|
|
62
|
+
let sends = 0;
|
|
63
|
+
const requestTicket = bearerFetch(getToken, async (input, init) => {
|
|
64
|
+
sends += 1;
|
|
65
|
+
onPhaseRef.current?.("ticket-requested");
|
|
66
|
+
const response = await fetch(input, init);
|
|
67
|
+
if (response.status === 401 && sends === 1)
|
|
68
|
+
onPhaseRef.current?.("token-requested");
|
|
69
|
+
return response;
|
|
70
|
+
});
|
|
71
|
+
const ticketUrl = new URL(`/${chatTicketPath}`, mantaBaseUrl);
|
|
72
|
+
const mode = query[chatModeQueryParam];
|
|
73
|
+
if (isPresent(mode))
|
|
74
|
+
ticketUrl.searchParams.set(chatModeQueryParam, mode);
|
|
75
|
+
onPhaseRef.current?.("token-requested");
|
|
76
|
+
requestTicket(ticketUrl, {
|
|
60
77
|
method: "POST",
|
|
61
78
|
headers: datastoreHeader(query[datastoreQueryParam]),
|
|
62
79
|
})
|
|
@@ -72,6 +89,7 @@ export function useChatSocketAuth(datastoreQuery) {
|
|
|
72
89
|
if (cancelled)
|
|
73
90
|
return;
|
|
74
91
|
ticketedAt.current = Date.now();
|
|
92
|
+
onPhaseRef.current?.("ticket-received");
|
|
75
93
|
setTicketed({ datastoreKey, query: { ...query, [chatTicketQueryParam]: ticket } });
|
|
76
94
|
})
|
|
77
95
|
.catch((error) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-socket-auth.js","sourceRoot":"","sources":["../../src/providers/chat-socket-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"chat-socket-auth.js","sourceRoot":"","sources":["../../src/providers/chat-socket-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ChatStartupReport } from "../lib/chat-types.js";
|
|
2
|
+
export type ChatSocketAuthPhase = "token-requested" | "ticket-requested" | "ticket-received";
|
|
3
|
+
export type ChatViewStartupPhase = "chat-mounted" | "first-paint" | "interactive";
|
|
4
|
+
export type ChatStartupPhase = ChatSocketAuthPhase | "socket-enabled" | "socket-open" | ChatViewStartupPhase;
|
|
5
|
+
export type ChatStartupTimeline = {
|
|
6
|
+
startedAt: number;
|
|
7
|
+
marks: Partial<Record<ChatStartupPhase, number>>;
|
|
8
|
+
ticketAttempts: number;
|
|
9
|
+
socketAttempts: number;
|
|
10
|
+
};
|
|
11
|
+
export declare function createChatStartupTimeline(): ChatStartupTimeline;
|
|
12
|
+
export declare function markChatStartup(timeline: ChatStartupTimeline, phase: ChatStartupPhase): boolean;
|
|
13
|
+
export declare function chatStartupReport(timeline: ChatStartupTimeline, input: Pick<ChatStartupReport, "surface" | "mode" | "openIndex">): ChatStartupReport | undefined;
|
|
14
|
+
//# sourceMappingURL=chat-startup-timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat-startup-timing.d.ts","sourceRoot":"","sources":["../../src/providers/chat-startup-timing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,MAAM,mBAAmB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,iBAAiB,CAAC;AAE7F,MAAM,MAAM,oBAAoB,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;AAElF,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,aAAa,GAAG,oBAAoB,CAAC;AAE7G,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAgB,yBAAyB,IAAI,mBAAmB,CAE/D;AAmBD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAiB/F;AAMD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,mBAAmB,EAC7B,KAAK,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,GAAG,MAAM,GAAG,WAAW,CAAC,GAC/D,iBAAiB,GAAG,SAAS,CA0B/B"}
|
|
@@ -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.1",
|
|
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/
|
|
1138
|
-
"@manta-eu/
|
|
1139
|
-
"@manta-eu/lib": "0.
|
|
1140
|
-
"@manta-eu/
|
|
1141
|
-
"@manta-eu/
|
|
1142
|
-
"@manta-eu/
|
|
1137
|
+
"@manta-eu/client": "0.5.1",
|
|
1138
|
+
"@manta-eu/ldo": "0.5.1",
|
|
1139
|
+
"@manta-eu/rdf-lib": "0.5.1",
|
|
1140
|
+
"@manta-eu/auth": "0.5.1",
|
|
1141
|
+
"@manta-eu/datalog-parser": "0.5.1",
|
|
1142
|
+
"@manta-eu/lib": "0.5.1"
|
|
1143
1143
|
},
|
|
1144
1144
|
"peerDependencies": {
|
|
1145
1145
|
"@ulb-darmstadt/shacl-form": "^2.1.1-rc1",
|
|
@@ -16,7 +16,7 @@ import { humanCount } from "@manta-eu/lib/humanize";
|
|
|
16
16
|
import { isPresent } from "@manta-eu/lib/present";
|
|
17
17
|
import type { ChatStatus, FileUIPart } from "ai";
|
|
18
18
|
import { ArrowUp } from "lucide-react";
|
|
19
|
-
import type { ReactNode } from "react";
|
|
19
|
+
import type { ChangeEvent, ReactNode, RefObject } from "react";
|
|
20
20
|
import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
21
21
|
import { toast } from "sonner";
|
|
22
22
|
import { match, P } from "ts-pattern";
|
|
@@ -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,9 +125,54 @@ 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
|
+
|
|
141
|
+
export type ComposerCarryOver = { conversationId: string | undefined; text: string };
|
|
142
|
+
|
|
143
|
+
/** The unsent text a remounted composer starts with: its own chat's, or that of the blank chat it just became. */
|
|
144
|
+
export function carriedComposerText(
|
|
145
|
+
carryOver: ComposerCarryOver,
|
|
146
|
+
conversationId: string | undefined,
|
|
147
|
+
hasPendingMessage: boolean,
|
|
148
|
+
): string {
|
|
149
|
+
if (carryOver.conversationId === conversationId) return carryOver.text;
|
|
150
|
+
return carryOver.conversationId === undefined && hasPendingMessage ? carryOver.text : "";
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function useComposerCarryOver(
|
|
154
|
+
carryOverRef: RefObject<ComposerCarryOver>,
|
|
155
|
+
conversationId: string | undefined,
|
|
156
|
+
hasPendingMessage: boolean,
|
|
157
|
+
) {
|
|
158
|
+
const [initialText] = useState(() => carriedComposerText(carryOverRef.current, conversationId, hasPendingMessage));
|
|
159
|
+
const rememberText = useCallback(
|
|
160
|
+
(text: string) => {
|
|
161
|
+
carryOverRef.current = { conversationId, text };
|
|
162
|
+
},
|
|
163
|
+
[carryOverRef, conversationId],
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
useEffect(() => rememberText(initialText), [rememberText, initialText]);
|
|
167
|
+
|
|
168
|
+
return { initialText: isPresent(initialText) ? initialText : undefined, rememberText };
|
|
169
|
+
}
|
|
170
|
+
|
|
118
171
|
export function Chat(props: ChatProps) {
|
|
119
172
|
const turnState = useChatTurnState();
|
|
120
|
-
|
|
173
|
+
// ChatContent remounts when a blank chat becomes a conversation; the composer's unsent text outlives it here.
|
|
174
|
+
const composerCarryOver = useRef<ComposerCarryOver>({ conversationId: undefined, text: "" });
|
|
175
|
+
const content = <ChatContent {...props} turnState={turnState} composerCarryOver={composerCarryOver} />;
|
|
121
176
|
|
|
122
177
|
return <ActiveChatProvider>{props.isEmbedded ? <Suspense>{content}</Suspense> : content}</ActiveChatProvider>;
|
|
123
178
|
}
|
|
@@ -170,7 +225,27 @@ export function getChatWelcomeContent(args: ChatWelcomeArgs): ChatWelcomeContent
|
|
|
170
225
|
.exhaustive();
|
|
171
226
|
}
|
|
172
227
|
|
|
173
|
-
|
|
228
|
+
export type ChatConnectingArgs = {
|
|
229
|
+
hasPendingMessage: boolean;
|
|
230
|
+
isConversationLoading: boolean;
|
|
231
|
+
isBlankChat: boolean;
|
|
232
|
+
hasMessages: boolean;
|
|
233
|
+
isSocketOpen: boolean;
|
|
234
|
+
isTranscriptSynced: boolean;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
export function chatIsConnectingOrSyncing(args: ChatConnectingArgs): boolean {
|
|
238
|
+
if (args.hasPendingMessage) return false;
|
|
239
|
+
if (args.isConversationLoading) return true;
|
|
240
|
+
return !args.isBlankChat && !args.hasMessages && (!args.isSocketOpen || !args.isTranscriptSynced);
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
type ChatContentProps = ChatProps & {
|
|
244
|
+
turnState: ChatTurnState;
|
|
245
|
+
composerCarryOver: RefObject<ComposerCarryOver>;
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
function ChatContent(props: ChatContentProps) {
|
|
174
249
|
const {
|
|
175
250
|
datastore,
|
|
176
251
|
user,
|
|
@@ -187,6 +262,7 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
187
262
|
mark,
|
|
188
263
|
renderMenuItems,
|
|
189
264
|
turnState,
|
|
265
|
+
composerCarryOver,
|
|
190
266
|
} = props;
|
|
191
267
|
|
|
192
268
|
const assistantName = useAssistantName();
|
|
@@ -223,8 +299,8 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
223
299
|
startNewChat,
|
|
224
300
|
activeConversation,
|
|
225
301
|
isConversationLoading,
|
|
226
|
-
connectionState,
|
|
227
302
|
sendNewConversationMessage,
|
|
303
|
+
markStartup,
|
|
228
304
|
} = useChatManagerConnection();
|
|
229
305
|
const activeChat = useActiveChatConnection();
|
|
230
306
|
const agent = activeChat?.agent ?? managerAgent;
|
|
@@ -248,10 +324,14 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
248
324
|
const hasPendingQuestionnaire =
|
|
249
325
|
latestMessage?.role === "assistant" && latestMessage.parts.some(isPendingRequestUserInputPart);
|
|
250
326
|
const isTranscriptSynced = activeChat?.isTranscriptSynced ?? !activeConversation?.id;
|
|
251
|
-
const isConnectingOrSyncing =
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
327
|
+
const isConnectingOrSyncing = chatIsConnectingOrSyncing({
|
|
328
|
+
hasPendingMessage,
|
|
329
|
+
isConversationLoading,
|
|
330
|
+
isBlankChat: !isPresent(activeConversation) && !isPresent(selectedContext),
|
|
331
|
+
hasMessages: isPresent(agentMessages),
|
|
332
|
+
isSocketOpen: agent.readyState === WebSocket.OPEN,
|
|
333
|
+
isTranscriptSynced,
|
|
334
|
+
});
|
|
255
335
|
const isSessionConnecting = Boolean(activeConversation?.id) && (agent.readyState !== WebSocket.OPEN || !agentState);
|
|
256
336
|
|
|
257
337
|
const addToolResult = chatData?.addToolResult;
|
|
@@ -279,7 +359,6 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
279
359
|
.otherwise(({ status }) => status);
|
|
280
360
|
|
|
281
361
|
const toolsUsedInSession = useRef(new Set<string>());
|
|
282
|
-
const initialPromptSentRef = useRef<string | undefined>(undefined);
|
|
283
362
|
|
|
284
363
|
const { uploadFiles, isUploading, progress: uploadProgress } = useChatUpload();
|
|
285
364
|
|
|
@@ -336,6 +415,22 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
336
415
|
);
|
|
337
416
|
|
|
338
417
|
const composerDraft = useComposerDraft(initialDraft, handleAgentSubmit);
|
|
418
|
+
const { initialText: carriedText, rememberText } = useComposerCarryOver(
|
|
419
|
+
composerCarryOver,
|
|
420
|
+
activeConversation?.id,
|
|
421
|
+
hasPendingMessage,
|
|
422
|
+
);
|
|
423
|
+
const submitComposer = useCallback(
|
|
424
|
+
(value: string, files: File[]) => {
|
|
425
|
+
rememberText("");
|
|
426
|
+
return composerDraft.onSubmit(value, files);
|
|
427
|
+
},
|
|
428
|
+
[composerDraft, rememberText],
|
|
429
|
+
);
|
|
430
|
+
const rememberComposerText = useCallback(
|
|
431
|
+
(event: ChangeEvent<HTMLTextAreaElement>) => rememberText(event.target.value),
|
|
432
|
+
[rememberText],
|
|
433
|
+
);
|
|
339
434
|
|
|
340
435
|
const handleConversationStarterSubmit = useCallback(
|
|
341
436
|
(value: string) => {
|
|
@@ -344,13 +439,7 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
344
439
|
[handleAgentSubmit],
|
|
345
440
|
);
|
|
346
441
|
|
|
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]);
|
|
442
|
+
useInitialPrompt(initialPrompt, handleConversationStarterSubmit);
|
|
354
443
|
|
|
355
444
|
const handleRetryTurn = useCallback(async () => {
|
|
356
445
|
if (!chatData?.regenerate) return;
|
|
@@ -397,6 +486,18 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
397
486
|
const pendingAssistantMessageId = activeTurnKey ?? latestMessage?.id;
|
|
398
487
|
const needsPendingPlaceholder = isAwaitingAssistant && latestMessage?.role !== "assistant";
|
|
399
488
|
|
|
489
|
+
useEffect(() => {
|
|
490
|
+
markStartup("chat-mounted");
|
|
491
|
+
}, [markStartup]);
|
|
492
|
+
|
|
493
|
+
useEffect(() => {
|
|
494
|
+
if (!isConnectingOrSyncing) markStartup("first-paint");
|
|
495
|
+
}, [isConnectingOrSyncing, markStartup]);
|
|
496
|
+
|
|
497
|
+
useEffect(() => {
|
|
498
|
+
if (!isConnectingOrSyncing && !isComposerBusy) markStartup("interactive");
|
|
499
|
+
}, [isConnectingOrSyncing, isComposerBusy, markStartup]);
|
|
500
|
+
|
|
400
501
|
const displayMessages = useMemo(() => {
|
|
401
502
|
if (!needsPendingPlaceholder || !pendingAssistantMessageId) return agentMessages;
|
|
402
503
|
const placeholder: ChatUIMessage = {
|
|
@@ -537,9 +638,9 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
537
638
|
|
|
538
639
|
<ChatInput
|
|
539
640
|
key={composerDraft.key}
|
|
540
|
-
initialValue={composerDraft.initialValue}
|
|
641
|
+
initialValue={composerDraft.initialValue ?? carriedText}
|
|
541
642
|
dropTargetRef={dropZoneRef}
|
|
542
|
-
onSubmit={isComposerBusy ? undefined :
|
|
643
|
+
onSubmit={isComposerBusy ? undefined : submitComposer}
|
|
543
644
|
onRejected={handleFilesRejected}
|
|
544
645
|
topContent={<ChatInputFilePreview progress={uploadProgress} />}
|
|
545
646
|
>
|
|
@@ -549,6 +650,7 @@ function ChatContent(props: ChatProps & { turnState: ChatTurnState }) {
|
|
|
549
650
|
className="pl-5"
|
|
550
651
|
autoFocus={shouldAutoFocusInput}
|
|
551
652
|
disabled={hasPendingQuestionnaire}
|
|
653
|
+
onChange={rememberComposerText}
|
|
552
654
|
data-chat-input
|
|
553
655
|
/>
|
|
554
656
|
<ChatInputSubmit
|
|
@@ -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
|
|
@@ -107,6 +107,7 @@ export function Sidebar(props: SidebarProps) {
|
|
|
107
107
|
const canManageTeam = authContext?.canManageTeam ?? false;
|
|
108
108
|
const canManageCustomApps = authContext?.canManageCustomApps ?? false;
|
|
109
109
|
const canDisconnectCustomApps = authContext?.canDisconnectCustomApps ?? false;
|
|
110
|
+
const hasProfilePage = authContext?.hasProfilePage ?? false;
|
|
110
111
|
const canManageStreams = authContext?.canManageStreams ?? isOperator ?? false;
|
|
111
112
|
|
|
112
113
|
const { state: sidebarState, isMobile, toggleSidebar, setOpenMobile } = useSidebar();
|
|
@@ -467,11 +468,11 @@ export function Sidebar(props: SidebarProps) {
|
|
|
467
468
|
}
|
|
468
469
|
onCloseAutoFocus={handleProfileMenuCloseAutoFocus}
|
|
469
470
|
onNavigateToAccount={() => {
|
|
470
|
-
|
|
471
|
+
if (hasProfilePage) pendingMenuNavigateRef.current = "/profile";
|
|
471
472
|
}}
|
|
472
473
|
onLogout={onLogout}
|
|
473
474
|
>
|
|
474
|
-
<DropdownGroup className="
|
|
475
|
+
<DropdownGroup className="px-2 pb-2">
|
|
475
476
|
<ThemeSelectorDropdown />
|
|
476
477
|
{canManageDatastores && (
|
|
477
478
|
<ManageDatastoresMenuItem onSelect={() => (pendingMenuNavigateRef.current = "/datastores")} />
|
|
@@ -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}
|