@gram-ai/elements 1.27.3 → 1.27.5
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 +72 -60
- package/README.typedoc.md +6 -6
- package/bin/cli.js +74 -74
- package/dist/compat-shims-CO9JXXV4.cjs.map +1 -1
- package/dist/{compat-shims-BPJ7Q68c.js → compat-shims-DxtUrORi.js} +4 -2
- package/dist/compat-shims-DxtUrORi.js.map +1 -0
- package/dist/components/ShareButton/index.d.ts +2 -2
- package/dist/components/assistant-ui/message-feedback.d.ts +1 -1
- package/dist/components/assistant-ui/tooltip-icon-button.d.ts +2 -2
- package/dist/components/ui/avatar.d.ts +2 -2
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/calendar.d.ts +1 -1
- package/dist/components/ui/collapsible.d.ts +1 -1
- package/dist/components/ui/dialog.d.ts +4 -4
- package/dist/components/ui/popover.d.ts +2 -2
- package/dist/components/ui/skeleton.d.ts +1 -1
- package/dist/components/ui/time-range-picker.d.ts +4 -2
- package/dist/components/ui/tool-ui.d.ts +7 -7
- package/dist/components/ui/tooltip.d.ts +2 -2
- package/dist/contexts/ConnectionStatusContext.d.ts +1 -1
- package/dist/elements.cjs +1 -1
- package/dist/elements.css +1 -1
- package/dist/elements.js +2 -2
- package/dist/hooks/useDensity.d.ts +73 -73
- package/dist/hooks/useMCPTools.d.ts +1 -1
- package/dist/hooks/useRadius.d.ts +1 -1
- package/dist/{index-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
- package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
- package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
- package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
- package/dist/{index-DBrhzauj.js → index-DuCQRbcQ.js} +6386 -6337
- package/dist/index-DuCQRbcQ.js.map +1 -0
- package/dist/{index-DxfW52oA.cjs → index-y_PNN5vK.cjs} +64 -46
- package/dist/index-y_PNN5vK.cjs.map +1 -0
- package/dist/lib/cassette.d.ts +4 -4
- package/dist/lib/errorTracking.d.ts +1 -1
- package/dist/lib/messageConverter.d.ts +1 -1
- package/dist/lib/models.d.ts +1 -1
- package/dist/plugins/chart/ui/bar-chart.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/accordion-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/accordion.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/action-button.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/alert-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/alert.d.ts +4 -4
- package/dist/plugins/generative-ui/ui/avatar.d.ts +5 -5
- package/dist/plugins/generative-ui/ui/badge.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/button-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/button.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/card-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/card.d.ts +8 -8
- package/dist/plugins/generative-ui/ui/checkbox.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/data-table.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/dialog.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/dropdown-menu.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/grid.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/input-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/input.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/label.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/metric.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/pagination.d.ts +6 -6
- package/dist/plugins/generative-ui/ui/popover.d.ts +4 -4
- package/dist/plugins/generative-ui/ui/progress.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/radio-group.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/select.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/separator.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/skeleton.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/stack.d.ts +6 -6
- package/dist/plugins/generative-ui/ui/switch.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/table.d.ts +9 -9
- package/dist/plugins/generative-ui/ui/tabs-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/tabs.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/text.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/textarea.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/tooltip.d.ts +1 -1
- package/dist/plugins.cjs +1 -1
- package/dist/plugins.js +1 -1
- package/dist/{profiler-D6ndqfsd.js → profiler-FpBY9eRv.js} +2 -2
- package/dist/{profiler-D6ndqfsd.js.map → profiler-FpBY9eRv.js.map} +1 -1
- package/dist/{profiler-DhnzZ34c.cjs → profiler-_mthyjvo.cjs} +2 -2
- package/dist/{profiler-DhnzZ34c.cjs.map → profiler-_mthyjvo.cjs.map} +1 -1
- package/dist/react-shim.js +1 -1
- package/dist/server/express.cjs.map +1 -1
- package/dist/server/express.js.map +1 -1
- package/dist/{startRecording-BwXmdmy1.cjs → startRecording-NJcpiHw-.cjs} +2 -2
- package/dist/{startRecording-BwXmdmy1.cjs.map → startRecording-NJcpiHw-.cjs.map} +1 -1
- package/dist/{startRecording-B_9CRZ_P.js → startRecording-r5MXQ2Dm.js} +2 -2
- package/dist/{startRecording-B_9CRZ_P.js.map → startRecording-r5MXQ2Dm.js.map} +1 -1
- package/dist/types/index.d.ts +2 -2
- package/package.json +1 -5
- package/src/compat-plugin.ts +14 -14
- package/src/compat-shims.ts +33 -31
- package/src/compat.test.ts +48 -48
- package/src/compat.ts +6 -6
- package/src/components/Chat/index.tsx +17 -17
- package/src/components/Chat/stories/Charts.stories.tsx +98 -98
- package/src/components/Chat/stories/Composer.stories.tsx +15 -15
- package/src/components/Chat/stories/ConnectionConfiguration.stories.tsx +44 -44
- package/src/components/Chat/stories/CustomComponents.stories.tsx +17 -17
- package/src/components/Chat/stories/Density.stories.tsx +20 -20
- package/src/components/Chat/stories/ErrorBoundary.stories.tsx +47 -47
- package/src/components/Chat/stories/FrontendTools.stories.tsx +39 -39
- package/src/components/Chat/stories/GenerativeUI.stories.tsx +48 -48
- package/src/components/Chat/stories/MessageFeedback.stories.tsx +52 -52
- package/src/components/Chat/stories/Modal.stories.tsx +28 -28
- package/src/components/Chat/stories/Model.stories.tsx +11 -11
- package/src/components/Chat/stories/Radius.stories.tsx +20 -20
- package/src/components/Chat/stories/Sidecar.stories.tsx +13 -13
- package/src/components/Chat/stories/StyleIsolation.stories.tsx +11 -11
- package/src/components/Chat/stories/Theme.stories.tsx +25 -25
- package/src/components/Chat/stories/Thread.stories.tsx +25 -25
- package/src/components/Chat/stories/ToolApproval.stories.tsx +55 -55
- package/src/components/Chat/stories/ToolMentions.stories.tsx +17 -17
- package/src/components/Chat/stories/Tools.stories.tsx +88 -88
- package/src/components/Chat/stories/Variants.stories.tsx +32 -32
- package/src/components/Chat/stories/Welcome.stories.tsx +14 -14
- package/src/components/ChatHistory.tsx +7 -7
- package/src/components/FrontendTools/index.tsx +5 -5
- package/src/components/Replay.stories.tsx +157 -157
- package/src/components/Replay.tsx +76 -73
- package/src/components/ShadowRoot.tsx +40 -40
- package/src/components/ShareButton/index.tsx +32 -32
- package/src/components/assistant-ui/assistant-modal.tsx +92 -87
- package/src/components/assistant-ui/assistant-sidecar.tsx +35 -35
- package/src/components/assistant-ui/attachment.tsx +80 -80
- package/src/components/assistant-ui/connection-status-indicator.tsx +33 -33
- package/src/components/assistant-ui/error-boundary.tsx +34 -34
- package/src/components/assistant-ui/follow-on-suggestions.tsx +26 -26
- package/src/components/assistant-ui/markdown-text.tsx +69 -69
- package/src/components/assistant-ui/mentioned-tools-badges.tsx +38 -38
- package/src/components/assistant-ui/message-feedback.tsx +74 -61
- package/src/components/assistant-ui/reasoning.tsx +83 -83
- package/src/components/assistant-ui/thread-list.tsx +45 -45
- package/src/components/assistant-ui/thread.tsx +278 -278
- package/src/components/assistant-ui/tool-fallback.tsx +37 -37
- package/src/components/assistant-ui/tool-group.tsx +26 -26
- package/src/components/assistant-ui/tool-mention-autocomplete.tsx +122 -122
- package/src/components/assistant-ui/tooltip-icon-button.tsx +18 -18
- package/src/components/ui/avatar.tsx +12 -12
- package/src/components/ui/button.tsx +12 -12
- package/src/components/ui/buttonVariants.ts +17 -17
- package/src/components/ui/calendar.tsx +106 -106
- package/src/components/ui/charts.stories.tsx +56 -56
- package/src/components/ui/collapsible.tsx +5 -5
- package/src/components/ui/dialog.tsx +30 -30
- package/src/components/ui/generative-ui.stories.tsx +200 -200
- package/src/components/ui/generative-ui.tsx +26 -26
- package/src/components/ui/popover.tsx +14 -14
- package/src/components/ui/skeleton.tsx +5 -5
- package/src/components/ui/time-range-picker.stories.tsx +80 -80
- package/src/components/ui/time-range-picker.tsx +272 -235
- package/src/components/ui/tool-ui.stories.tsx +37 -37
- package/src/components/ui/tool-ui.tsx +221 -215
- package/src/components/ui/tooltip.tsx +15 -15
- package/src/constants/tailwind.ts +1 -1
- package/src/contexts/ChatIdContext.tsx +7 -7
- package/src/contexts/ConnectionStatusContext.tsx +64 -64
- package/src/contexts/ElementsProvider.tsx +222 -211
- package/src/contexts/ReplayContext.ts +3 -3
- package/src/contexts/ToolApprovalContext.tsx +54 -54
- package/src/contexts/ToolExecutionContext.tsx +34 -34
- package/src/contexts/contexts.ts +7 -7
- package/src/contexts/portal-container-context.ts +2 -2
- package/src/contexts/portal-container.tsx +7 -7
- package/src/embedded.ts +1 -1
- package/src/global.css +25 -25
- package/src/hooks/useAuth.ts +72 -72
- package/src/hooks/useDensity.ts +79 -79
- package/src/hooks/useElements.ts +6 -6
- package/src/hooks/useExpanded.ts +12 -12
- package/src/hooks/useFollowOnSuggestions.ts +87 -82
- package/src/hooks/useGramThreadListAdapter.tsx +99 -99
- package/src/hooks/useMCPTools.ts +47 -47
- package/src/hooks/useModel.ts +14 -14
- package/src/hooks/usePluginComponents.ts +11 -11
- package/src/hooks/usePortalContainer.ts +5 -5
- package/src/hooks/useRadius.ts +23 -23
- package/src/hooks/useRecordCassette.ts +34 -34
- package/src/hooks/useSession.ts +11 -11
- package/src/hooks/useThemeProps.ts +13 -13
- package/src/hooks/useThreadId.ts +4 -4
- package/src/hooks/useToolApproval.ts +7 -7
- package/src/hooks/useToolMentions.ts +40 -40
- package/src/index.ts +26 -26
- package/src/lib/api.test.ts +61 -61
- package/src/lib/api.ts +4 -3
- package/src/lib/auth.ts +13 -13
- package/src/lib/cassette.ts +84 -84
- package/src/lib/easing.ts +1 -1
- package/src/lib/errorTracking.config.ts +5 -5
- package/src/lib/errorTracking.ts +29 -29
- package/src/lib/generative-ui.ts +7 -7
- package/src/lib/humanize.ts +3 -3
- package/src/lib/messageConverter.test.ts +130 -127
- package/src/lib/messageConverter.ts +196 -196
- package/src/lib/models.ts +21 -20
- package/src/lib/token.test.ts +56 -56
- package/src/lib/token.ts +14 -14
- package/src/lib/tool-mentions.ts +45 -45
- package/src/lib/tools.ts +66 -62
- package/src/lib/utils.ts +5 -5
- package/src/lib.d.ts +1 -1
- package/src/plugins/README.md +5 -5
- package/src/plugins/chart/catalog.ts +18 -18
- package/src/plugins/chart/chart.test.ts +31 -31
- package/src/plugins/chart/component.tsx +34 -34
- package/src/plugins/chart/index.ts +4 -4
- package/src/plugins/chart/ui/area-chart.tsx +42 -42
- package/src/plugins/chart/ui/bar-chart.tsx +46 -46
- package/src/plugins/chart/ui/donut-chart.tsx +48 -48
- package/src/plugins/chart/ui/index.ts +7 -7
- package/src/plugins/chart/ui/line-chart.tsx +43 -43
- package/src/plugins/chart/ui/pie-chart.tsx +44 -44
- package/src/plugins/chart/ui/radar-chart.tsx +33 -33
- package/src/plugins/chart/ui/scatter-chart.tsx +43 -43
- package/src/plugins/components/MacOSWindowFrame.tsx +15 -15
- package/src/plugins/components/PluginLoadingState.tsx +10 -10
- package/src/plugins/components/index.ts +1 -1
- package/src/plugins/generative-ui/catalog.ts +54 -54
- package/src/plugins/generative-ui/component.tsx +85 -85
- package/src/plugins/generative-ui/index.ts +4 -4
- package/src/plugins/generative-ui/ui/accordion-wrapper.tsx +16 -16
- package/src/plugins/generative-ui/ui/accordion.tsx +16 -16
- package/src/plugins/generative-ui/ui/action-button.tsx +28 -28
- package/src/plugins/generative-ui/ui/alert-wrapper.tsx +8 -8
- package/src/plugins/generative-ui/ui/alert.tsx +20 -20
- package/src/plugins/generative-ui/ui/avatar-wrapper.tsx +7 -7
- package/src/plugins/generative-ui/ui/avatar.tsx +30 -30
- package/src/plugins/generative-ui/ui/badge.tsx +22 -22
- package/src/plugins/generative-ui/ui/button-wrapper.tsx +12 -12
- package/src/plugins/generative-ui/ui/button.tsx +28 -28
- package/src/plugins/generative-ui/ui/card-wrapper.tsx +8 -8
- package/src/plugins/generative-ui/ui/card.tsx +27 -27
- package/src/plugins/generative-ui/ui/checkbox-wrapper.tsx +9 -9
- package/src/plugins/generative-ui/ui/checkbox.tsx +9 -9
- package/src/plugins/generative-ui/ui/data-table.tsx +8 -8
- package/src/plugins/generative-ui/ui/dialog.tsx +31 -31
- package/src/plugins/generative-ui/ui/dropdown-menu.tsx +44 -44
- package/src/plugins/generative-ui/ui/grid.tsx +12 -12
- package/src/plugins/generative-ui/ui/index.ts +40 -40
- package/src/plugins/generative-ui/ui/input-wrapper.tsx +11 -11
- package/src/plugins/generative-ui/ui/input.tsx +9 -9
- package/src/plugins/generative-ui/ui/label.tsx +8 -8
- package/src/plugins/generative-ui/ui/list.tsx +11 -11
- package/src/plugins/generative-ui/ui/metric.tsx +23 -23
- package/src/plugins/generative-ui/ui/pagination.tsx +28 -28
- package/src/plugins/generative-ui/ui/popover.tsx +21 -21
- package/src/plugins/generative-ui/ui/progress.tsx +13 -13
- package/src/plugins/generative-ui/ui/radio-group.tsx +12 -12
- package/src/plugins/generative-ui/ui/select-wrapper.tsx +7 -7
- package/src/plugins/generative-ui/ui/select.tsx +37 -37
- package/src/plugins/generative-ui/ui/separator.tsx +9 -9
- package/src/plugins/generative-ui/ui/skeleton-wrapper.tsx +10 -10
- package/src/plugins/generative-ui/ui/skeleton.tsx +5 -5
- package/src/plugins/generative-ui/ui/stack.tsx +28 -28
- package/src/plugins/generative-ui/ui/switch.tsx +11 -11
- package/src/plugins/generative-ui/ui/table.tsx +32 -32
- package/src/plugins/generative-ui/ui/tabs-wrapper.tsx +11 -11
- package/src/plugins/generative-ui/ui/tabs.tsx +26 -26
- package/src/plugins/generative-ui/ui/text.tsx +12 -12
- package/src/plugins/generative-ui/ui/textarea.tsx +7 -7
- package/src/plugins/generative-ui/ui/tooltip.tsx +12 -12
- package/src/plugins/index.ts +7 -7
- package/src/react-shim.ts +6 -6
- package/src/server/bun.ts +12 -12
- package/src/server/core.ts +25 -25
- package/src/server/express.ts +17 -15
- package/src/server/fastify.ts +14 -14
- package/src/server/hono.ts +9 -9
- package/src/server/nextjs.ts +12 -12
- package/src/server/tanstack-start.ts +12 -12
- package/src/server.ts +27 -27
- package/src/storybook.d.ts +4 -4
- package/src/types/index.ts +122 -122
- package/src/types/plugins.ts +7 -7
- package/src/vite-env.d.ts +12 -12
- package/dist/compat-shims-BPJ7Q68c.js.map +0 -1
- package/dist/index-DBrhzauj.js.map +0 -1
- package/dist/index-DxfW52oA.cjs.map +0 -1
package/src/hooks/useAuth.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useReplayContext } from
|
|
1
|
+
import { useReplayContext } from "@/contexts/ReplayContext";
|
|
2
2
|
import {
|
|
3
3
|
hasExplicitSessionAuth,
|
|
4
4
|
isAnyStaticSession,
|
|
@@ -6,63 +6,63 @@ import {
|
|
|
6
6
|
isStaticSessionAuth,
|
|
7
7
|
isUnifiedFunctionSession,
|
|
8
8
|
isUnifiedStaticSession,
|
|
9
|
-
} from
|
|
10
|
-
import { getTokenExpiry } from
|
|
11
|
-
import { useCallback, useMemo } from
|
|
12
|
-
import { ApiConfig, GetSessionFn } from
|
|
13
|
-
import { getChatSessionQueryKey, useSession } from
|
|
14
|
-
import { useQueryClient } from
|
|
9
|
+
} from "@/lib/auth";
|
|
10
|
+
import { getTokenExpiry } from "@/lib/token";
|
|
11
|
+
import { useCallback, useMemo } from "react";
|
|
12
|
+
import { ApiConfig, GetSessionFn } from "../types";
|
|
13
|
+
import { getChatSessionQueryKey, useSession } from "./useSession";
|
|
14
|
+
import { useQueryClient } from "@tanstack/react-query";
|
|
15
15
|
|
|
16
|
-
declare const __GRAM_API_URL__: string | undefined
|
|
16
|
+
declare const __GRAM_API_URL__: string | undefined;
|
|
17
17
|
|
|
18
18
|
export type Auth =
|
|
19
19
|
| {
|
|
20
|
-
headers: Record<string, string
|
|
21
|
-
isLoading: false
|
|
22
|
-
ensureValidHeaders: () => Promise<Record<string, string
|
|
20
|
+
headers: Record<string, string>;
|
|
21
|
+
isLoading: false;
|
|
22
|
+
ensureValidHeaders: () => Promise<Record<string, string>>;
|
|
23
23
|
}
|
|
24
24
|
| {
|
|
25
|
-
headers?: Record<string, string
|
|
26
|
-
isLoading: true
|
|
27
|
-
ensureValidHeaders: () => Promise<Record<string, string
|
|
28
|
-
}
|
|
25
|
+
headers?: Record<string, string>;
|
|
26
|
+
isLoading: true;
|
|
27
|
+
ensureValidHeaders: () => Promise<Record<string, string>>;
|
|
28
|
+
};
|
|
29
29
|
|
|
30
30
|
async function defaultGetSession(init: {
|
|
31
|
-
projectSlug: string
|
|
31
|
+
projectSlug: string;
|
|
32
32
|
}): Promise<string> {
|
|
33
|
-
const response = await fetch(
|
|
34
|
-
method:
|
|
33
|
+
const response = await fetch("/chat/session", {
|
|
34
|
+
method: "POST",
|
|
35
35
|
headers: {
|
|
36
|
-
|
|
36
|
+
"Gram-Project": init.projectSlug,
|
|
37
37
|
},
|
|
38
38
|
body: JSON.stringify({
|
|
39
39
|
embedOrigin: window.location.origin,
|
|
40
40
|
}),
|
|
41
|
-
})
|
|
42
|
-
const data = await response.json()
|
|
43
|
-
return data.client_token
|
|
41
|
+
});
|
|
42
|
+
const data = await response.json();
|
|
43
|
+
return data.client_token;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
function createDangerousApiKeySessionFn(
|
|
47
47
|
apiKey: string,
|
|
48
|
-
apiUrl: string
|
|
48
|
+
apiUrl: string,
|
|
49
49
|
): GetSessionFn {
|
|
50
50
|
return async ({ projectSlug }) => {
|
|
51
51
|
const response = await fetch(`${apiUrl}/rpc/chatSessions.create`, {
|
|
52
|
-
method:
|
|
52
|
+
method: "POST",
|
|
53
53
|
headers: {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
"Gram-Key": apiKey,
|
|
56
|
+
"Gram-Project": projectSlug,
|
|
57
57
|
},
|
|
58
58
|
body: JSON.stringify({
|
|
59
59
|
embed_origin: window.location.origin,
|
|
60
|
-
user_identifier:
|
|
60
|
+
user_identifier: "elements-dev",
|
|
61
61
|
}),
|
|
62
|
-
})
|
|
63
|
-
const data = await response.json()
|
|
64
|
-
return data.client_token
|
|
65
|
-
}
|
|
62
|
+
});
|
|
63
|
+
const data = await response.json();
|
|
64
|
+
return data.client_token;
|
|
65
|
+
};
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
/**
|
|
@@ -73,47 +73,47 @@ export const useAuth = ({
|
|
|
73
73
|
projectSlug,
|
|
74
74
|
auth,
|
|
75
75
|
}: {
|
|
76
|
-
auth?: ApiConfig
|
|
77
|
-
projectSlug: string
|
|
76
|
+
auth?: ApiConfig;
|
|
77
|
+
projectSlug: string;
|
|
78
78
|
}): Auth => {
|
|
79
|
-
const replayCtx = useReplayContext()
|
|
80
|
-
const isReplay = replayCtx?.isReplay ?? false
|
|
81
|
-
const queryClient = useQueryClient()
|
|
79
|
+
const replayCtx = useReplayContext();
|
|
80
|
+
const isReplay = replayCtx?.isReplay ?? false;
|
|
81
|
+
const queryClient = useQueryClient();
|
|
82
82
|
|
|
83
83
|
const apiUrl = useMemo(() => {
|
|
84
84
|
const envUrl =
|
|
85
|
-
typeof __GRAM_API_URL__ !==
|
|
86
|
-
const url = auth?.url || envUrl ||
|
|
87
|
-
return url.replace(/\/+$/,
|
|
88
|
-
}, [auth?.url])
|
|
85
|
+
typeof __GRAM_API_URL__ !== "undefined" ? __GRAM_API_URL__ : undefined;
|
|
86
|
+
const url = auth?.url || envUrl || "https://app.getgram.ai";
|
|
87
|
+
return url.replace(/\/+$/, "");
|
|
88
|
+
}, [auth?.url]);
|
|
89
89
|
|
|
90
90
|
const getSession = useMemo(() => {
|
|
91
91
|
// In replay mode, skip session fetching entirely
|
|
92
92
|
if (isReplay) {
|
|
93
|
-
return null
|
|
93
|
+
return null;
|
|
94
94
|
}
|
|
95
95
|
// dangerousApiKey — exchange key for session via API
|
|
96
96
|
if (isDangerousApiKeyAuth(auth)) {
|
|
97
|
-
return createDangerousApiKeySessionFn(auth.dangerousApiKey, apiUrl)
|
|
97
|
+
return createDangerousApiKeySessionFn(auth.dangerousApiKey, apiUrl);
|
|
98
98
|
}
|
|
99
99
|
// Unified session: static string
|
|
100
100
|
if (isUnifiedStaticSession(auth)) {
|
|
101
|
-
return () => Promise.resolve(auth.session)
|
|
101
|
+
return () => Promise.resolve(auth.session);
|
|
102
102
|
}
|
|
103
103
|
// Unified session: function
|
|
104
104
|
if (isUnifiedFunctionSession(auth)) {
|
|
105
|
-
return auth.session
|
|
105
|
+
return auth.session;
|
|
106
106
|
}
|
|
107
107
|
// Legacy: static sessionToken (deprecated)
|
|
108
108
|
if (isStaticSessionAuth(auth)) {
|
|
109
|
-
return () => Promise.resolve(auth.sessionToken)
|
|
109
|
+
return () => Promise.resolve(auth.sessionToken);
|
|
110
110
|
}
|
|
111
111
|
// Legacy: explicit sessionFn (deprecated)
|
|
112
112
|
if (hasExplicitSessionAuth(auth)) {
|
|
113
|
-
return auth.sessionFn
|
|
113
|
+
return auth.sessionFn;
|
|
114
114
|
}
|
|
115
|
-
return defaultGetSession
|
|
116
|
-
}, [auth, isReplay, apiUrl])
|
|
115
|
+
return defaultGetSession;
|
|
116
|
+
}, [auth, isReplay, apiUrl]);
|
|
117
117
|
|
|
118
118
|
// The session request is only necessary if we are not using static session auth
|
|
119
119
|
// configuration. If a custom session fetcher is provided, we use it,
|
|
@@ -121,46 +121,46 @@ export const useAuth = ({
|
|
|
121
121
|
const session = useSession({
|
|
122
122
|
getSession,
|
|
123
123
|
projectSlug,
|
|
124
|
-
})
|
|
124
|
+
});
|
|
125
125
|
|
|
126
|
-
const shouldRefresh = !isAnyStaticSession(auth) && !isReplay
|
|
126
|
+
const shouldRefresh = !isAnyStaticSession(auth) && !isReplay;
|
|
127
127
|
|
|
128
128
|
const ensureValidHeaders = useCallback(async (): Promise<
|
|
129
129
|
Record<string, string>
|
|
130
130
|
> => {
|
|
131
|
-
const queryKey = getChatSessionQueryKey(projectSlug)
|
|
132
|
-
const cachedToken = queryClient.getQueryData<string>(queryKey)
|
|
131
|
+
const queryKey = getChatSessionQueryKey(projectSlug);
|
|
132
|
+
const cachedToken = queryClient.getQueryData<string>(queryKey);
|
|
133
133
|
|
|
134
134
|
if (!shouldRefresh || !getSession) {
|
|
135
135
|
return {
|
|
136
|
-
|
|
137
|
-
...(cachedToken && {
|
|
138
|
-
}
|
|
136
|
+
"Gram-Project": projectSlug,
|
|
137
|
+
...(cachedToken && { "Gram-Chat-Session": cachedToken }),
|
|
138
|
+
};
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
// Check if the cached token is expired (or within 30s of expiry).
|
|
142
142
|
// staleTime=0 forces a refetch; Infinity keeps the cached value.
|
|
143
|
-
const exp = cachedToken ? getTokenExpiry(cachedToken) : null
|
|
144
|
-
const isExpired = exp !== null && Date.now() >= exp * 1000 - 30_000
|
|
145
|
-
const staleTime = isExpired ? 0 : Infinity
|
|
143
|
+
const exp = cachedToken ? getTokenExpiry(cachedToken) : null;
|
|
144
|
+
const isExpired = exp !== null && Date.now() >= exp * 1000 - 30_000;
|
|
145
|
+
const staleTime = isExpired ? 0 : Infinity;
|
|
146
146
|
|
|
147
147
|
try {
|
|
148
148
|
const token = await queryClient.fetchQuery({
|
|
149
149
|
queryKey,
|
|
150
150
|
queryFn: () => getSession({ projectSlug }),
|
|
151
151
|
staleTime,
|
|
152
|
-
})
|
|
152
|
+
});
|
|
153
153
|
return {
|
|
154
|
-
|
|
155
|
-
...(token && {
|
|
156
|
-
}
|
|
154
|
+
"Gram-Project": projectSlug,
|
|
155
|
+
...(token && { "Gram-Chat-Session": token }),
|
|
156
|
+
};
|
|
157
157
|
} catch {
|
|
158
158
|
return {
|
|
159
|
-
|
|
160
|
-
...(cachedToken && {
|
|
161
|
-
}
|
|
159
|
+
"Gram-Project": projectSlug,
|
|
160
|
+
...(cachedToken && { "Gram-Chat-Session": cachedToken }),
|
|
161
|
+
};
|
|
162
162
|
}
|
|
163
|
-
}, [shouldRefresh, getSession, projectSlug, queryClient])
|
|
163
|
+
}, [shouldRefresh, getSession, projectSlug, queryClient]);
|
|
164
164
|
|
|
165
165
|
// In replay mode, return immediately without waiting for session
|
|
166
166
|
if (isReplay) {
|
|
@@ -168,7 +168,7 @@ export const useAuth = ({
|
|
|
168
168
|
headers: {},
|
|
169
169
|
isLoading: false,
|
|
170
170
|
ensureValidHeaders: async () => ({}),
|
|
171
|
-
}
|
|
171
|
+
};
|
|
172
172
|
}
|
|
173
173
|
|
|
174
174
|
return !session
|
|
@@ -178,10 +178,10 @@ export const useAuth = ({
|
|
|
178
178
|
}
|
|
179
179
|
: {
|
|
180
180
|
headers: {
|
|
181
|
-
|
|
182
|
-
|
|
181
|
+
"Gram-Project": projectSlug,
|
|
182
|
+
"Gram-Chat-Session": session,
|
|
183
183
|
},
|
|
184
184
|
isLoading: false,
|
|
185
185
|
ensureValidHeaders,
|
|
186
|
-
}
|
|
187
|
-
}
|
|
186
|
+
};
|
|
187
|
+
};
|
package/src/hooks/useDensity.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useElements } from
|
|
1
|
+
import { useElements } from "./useElements";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Density class mappings for different UI elements
|
|
@@ -6,105 +6,105 @@ import { useElements } from './useElements'
|
|
|
6
6
|
const densityClasses = {
|
|
7
7
|
compact: {
|
|
8
8
|
// Padding - small increments (1, 1.5, 2, 2.5, 3)
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
9
|
+
"p-xs": "p-1",
|
|
10
|
+
"p-sm": "p-1.5",
|
|
11
|
+
"p-md": "p-2",
|
|
12
|
+
"p-lg": "p-2.5",
|
|
13
|
+
"p-xl": "p-3",
|
|
14
|
+
"px-xs": "px-1",
|
|
15
|
+
"px-sm": "px-1.5",
|
|
16
|
+
"px-md": "px-2",
|
|
17
|
+
"px-lg": "px-2.5",
|
|
18
|
+
"px-xl": "px-3",
|
|
19
|
+
"py-xs": "py-1",
|
|
20
|
+
"py-sm": "py-1.5",
|
|
21
|
+
"py-md": "py-2",
|
|
22
|
+
"py-lg": "py-2.5",
|
|
23
|
+
"py-xl": "py-3",
|
|
24
24
|
// Gaps - small increments
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
"gap-sm": "gap-1",
|
|
26
|
+
"gap-md": "gap-1.5",
|
|
27
|
+
"gap-lg": "gap-2",
|
|
28
|
+
"gap-xl": "gap-2.5",
|
|
29
29
|
// Heights
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
"h-header": "h-10",
|
|
31
|
+
"h-input": "min-h-10",
|
|
32
32
|
// Text
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
"text-base": "text-sm",
|
|
34
|
+
"text-title": "text-xl",
|
|
35
|
+
"text-subtitle": "text-sm",
|
|
36
36
|
},
|
|
37
37
|
normal: {
|
|
38
38
|
// Padding - medium increments (1, 2, 3, 4, 5, 6)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
39
|
+
"p-xs": "p-1",
|
|
40
|
+
"p-sm": "p-2",
|
|
41
|
+
"p-md": "p-3",
|
|
42
|
+
"p-lg": "p-4",
|
|
43
|
+
"p-xl": "p-6",
|
|
44
|
+
"px-xs": "px-1",
|
|
45
|
+
"px-sm": "px-2",
|
|
46
|
+
"px-md": "px-3",
|
|
47
|
+
"px-lg": "px-4",
|
|
48
|
+
"px-xl": "px-6",
|
|
49
|
+
"py-xs": "py-1",
|
|
50
|
+
"py-sm": "py-2",
|
|
51
|
+
"py-md": "py-3",
|
|
52
|
+
"py-lg": "py-4",
|
|
53
|
+
"py-xl": "py-6",
|
|
54
54
|
// Gaps - medium increments
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
55
|
+
"gap-sm": "gap-1.5",
|
|
56
|
+
"gap-md": "gap-2",
|
|
57
|
+
"gap-lg": "gap-3",
|
|
58
|
+
"gap-xl": "gap-4",
|
|
59
59
|
// Heights
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
"h-header": "h-12",
|
|
61
|
+
"h-input": "min-h-12",
|
|
62
62
|
// Text
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
"text-base": "text-base",
|
|
64
|
+
"text-title": "text-2xl",
|
|
65
|
+
"text-subtitle": "text-base",
|
|
66
66
|
},
|
|
67
67
|
spacious: {
|
|
68
68
|
// Padding - large increments (2, 3, 4, 6, 8, 10)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
69
|
+
"p-xs": "p-2",
|
|
70
|
+
"p-sm": "p-3",
|
|
71
|
+
"p-md": "p-4",
|
|
72
|
+
"p-lg": "p-6",
|
|
73
|
+
"p-xl": "p-10",
|
|
74
|
+
"px-xs": "px-2",
|
|
75
|
+
"px-sm": "px-3",
|
|
76
|
+
"px-md": "px-4",
|
|
77
|
+
"px-lg": "px-6",
|
|
78
|
+
"px-xl": "px-10",
|
|
79
|
+
"py-xs": "py-2",
|
|
80
|
+
"py-sm": "py-3",
|
|
81
|
+
"py-md": "py-4",
|
|
82
|
+
"py-lg": "py-6",
|
|
83
|
+
"py-xl": "py-10",
|
|
84
84
|
// Gaps - large increments
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
85
|
+
"gap-sm": "gap-2",
|
|
86
|
+
"gap-md": "gap-3",
|
|
87
|
+
"gap-lg": "gap-4",
|
|
88
|
+
"gap-xl": "gap-6",
|
|
89
89
|
// Heights
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
"h-header": "h-14",
|
|
91
|
+
"h-input": "min-h-16",
|
|
92
92
|
// Text
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
"text-base": "text-lg",
|
|
94
|
+
"text-title": "text-3xl",
|
|
95
|
+
"text-subtitle": "text-lg",
|
|
96
96
|
},
|
|
97
|
-
} as const
|
|
97
|
+
} as const;
|
|
98
98
|
|
|
99
|
-
type DensityToken = keyof (typeof densityClasses)[
|
|
99
|
+
type DensityToken = keyof (typeof densityClasses)["normal"];
|
|
100
100
|
|
|
101
101
|
/**
|
|
102
102
|
* Hook to get density classes based on theme config
|
|
103
103
|
* Use: const d = useDensity(); then d('p-md') returns the appropriate padding class
|
|
104
104
|
*/
|
|
105
105
|
export const useDensity = () => {
|
|
106
|
-
const { config } = useElements()
|
|
107
|
-
const density = config.theme?.density ??
|
|
106
|
+
const { config } = useElements();
|
|
107
|
+
const density = config.theme?.density ?? "normal";
|
|
108
108
|
|
|
109
|
-
return (token: DensityToken) => densityClasses[density][token]
|
|
110
|
-
}
|
|
109
|
+
return (token: DensityToken) => densityClasses[density][token];
|
|
110
|
+
};
|
package/src/hooks/useElements.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import { useContext } from
|
|
2
|
-
import { ElementsContext } from
|
|
1
|
+
import { useContext } from "react";
|
|
2
|
+
import { ElementsContext } from "@/contexts/contexts";
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @private Internal hook to access the ElementsContext
|
|
6
6
|
*
|
|
7
7
|
*/
|
|
8
8
|
export const useElements = () => {
|
|
9
|
-
const context = useContext(ElementsContext)
|
|
9
|
+
const context = useContext(ElementsContext);
|
|
10
10
|
if (!context) {
|
|
11
|
-
throw new Error(
|
|
11
|
+
throw new Error("useElements must be used within a ElementsProvider");
|
|
12
12
|
}
|
|
13
|
-
return context
|
|
14
|
-
}
|
|
13
|
+
return context;
|
|
14
|
+
};
|
package/src/hooks/useExpanded.ts
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
import { Dispatch, SetStateAction } from
|
|
2
|
-
import { useElements } from
|
|
1
|
+
import { Dispatch, SetStateAction } from "react";
|
|
2
|
+
import { useElements } from "./useElements";
|
|
3
3
|
|
|
4
4
|
interface UseExpandedAPI {
|
|
5
|
-
expandable: boolean
|
|
6
|
-
isExpanded: boolean
|
|
7
|
-
defaultExpanded: boolean
|
|
8
|
-
setIsExpanded: Dispatch<SetStateAction<boolean
|
|
5
|
+
expandable: boolean;
|
|
6
|
+
isExpanded: boolean;
|
|
7
|
+
defaultExpanded: boolean;
|
|
8
|
+
setIsExpanded: Dispatch<SetStateAction<boolean>>;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
export const useExpanded = (): UseExpandedAPI => {
|
|
12
|
-
const { config, isExpanded, setIsExpanded } = useElements()
|
|
12
|
+
const { config, isExpanded, setIsExpanded } = useElements();
|
|
13
13
|
|
|
14
14
|
// Use sidecar config for sidecar variant, modal config for widget variant
|
|
15
15
|
const expandableConfig =
|
|
16
|
-
config.variant ===
|
|
16
|
+
config.variant === "sidecar" ? config.sidecar : config.modal;
|
|
17
17
|
|
|
18
|
-
const expandable = expandableConfig?.expandable ?? false
|
|
19
|
-
const defaultExpanded = expandableConfig?.defaultExpanded ?? false
|
|
18
|
+
const expandable = expandableConfig?.expandable ?? false;
|
|
19
|
+
const defaultExpanded = expandableConfig?.defaultExpanded ?? false;
|
|
20
20
|
|
|
21
21
|
return {
|
|
22
22
|
expandable,
|
|
23
23
|
isExpanded,
|
|
24
24
|
setIsExpanded,
|
|
25
25
|
defaultExpanded,
|
|
26
|
-
}
|
|
27
|
-
}
|
|
26
|
+
};
|
|
27
|
+
};
|