@gram-ai/elements 1.27.4 → 1.27.6
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 +1 -1
- 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-KSX4Qjip.cjs → index-A17b62wR.cjs} +10 -10
- package/dist/index-A17b62wR.cjs.map +1 -0
- 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-D0bAYNQy.js → index-Dm2wLFTN.js} +304 -282
- package/dist/index-Dm2wLFTN.js.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-CyzxBxVz.cjs → profiler-Cbbf4eEX.cjs} +2 -2
- package/dist/{profiler-CyzxBxVz.cjs.map → profiler-Cbbf4eEX.cjs.map} +1 -1
- package/dist/{profiler-BFkhZRxj.js → profiler-mca4IXaY.js} +2 -2
- package/dist/{profiler-BFkhZRxj.js.map → profiler-mca4IXaY.js.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-C-PPAs_Z.js → startRecording-BCafdS7B.js} +2 -2
- package/dist/{startRecording-C-PPAs_Z.js.map → startRecording-BCafdS7B.js.map} +1 -1
- package/dist/{startRecording-Dq92sEHf.cjs → startRecording-Eb5f7wqP.cjs} +2 -2
- package/dist/{startRecording-Dq92sEHf.cjs.map → startRecording-Eb5f7wqP.cjs.map} +1 -1
- package/dist/types/index.d.ts +4 -4
- 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 +57 -50
- 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 +248 -246
- 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 +214 -213
- 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 +83 -83
- 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 +28 -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 +124 -124
- 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-D0bAYNQy.js.map +0 -1
- package/dist/index-KSX4Qjip.cjs.map +0 -1
package/src/react-shim.ts
CHANGED
|
@@ -5,15 +5,15 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
// @ts-expect-error — resolved by the Vite plugin to the real react package
|
|
8
|
-
import * as ReactOriginal from
|
|
9
|
-
import { createShims } from
|
|
8
|
+
import * as ReactOriginal from "react-original";
|
|
9
|
+
import { createShims } from "./compat-shims";
|
|
10
10
|
|
|
11
|
-
const Shimmed = { ...ReactOriginal, ...createShims(ReactOriginal) }
|
|
11
|
+
const Shimmed = { ...ReactOriginal, ...createShims(ReactOriginal) };
|
|
12
12
|
|
|
13
13
|
// React internals required by react-dom
|
|
14
14
|
export const __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED =
|
|
15
15
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
16
|
-
(ReactOriginal as any).__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
|
|
16
|
+
(ReactOriginal as any).__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
|
|
17
17
|
|
|
18
18
|
export const {
|
|
19
19
|
Children,
|
|
@@ -49,6 +49,6 @@ export const {
|
|
|
49
49
|
useSyncExternalStore,
|
|
50
50
|
useTransition,
|
|
51
51
|
version,
|
|
52
|
-
} = Shimmed
|
|
52
|
+
} = Shimmed;
|
|
53
53
|
|
|
54
|
-
export default Shimmed
|
|
54
|
+
export default Shimmed;
|
package/src/server/bun.ts
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
import { createChatSession, type SessionHandlerOptions } from
|
|
22
|
+
import { createChatSession, type SessionHandlerOptions } from "./core";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Create a Bun route handler for the chat session endpoint.
|
|
@@ -31,33 +31,33 @@ export function createBunHandler(
|
|
|
31
31
|
options:
|
|
32
32
|
| SessionHandlerOptions
|
|
33
33
|
| ((
|
|
34
|
-
request: Request
|
|
35
|
-
) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
|
|
34
|
+
request: Request,
|
|
35
|
+
) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
|
|
36
36
|
) {
|
|
37
37
|
return async (request: Request) => {
|
|
38
|
-
const projectSlug = request.headers.get(
|
|
38
|
+
const projectSlug = request.headers.get("gram-project");
|
|
39
39
|
|
|
40
40
|
if (!projectSlug) {
|
|
41
41
|
return new Response(
|
|
42
|
-
JSON.stringify({ error:
|
|
42
|
+
JSON.stringify({ error: "Missing Gram-Project header" }),
|
|
43
43
|
{
|
|
44
44
|
status: 400,
|
|
45
|
-
headers: {
|
|
46
|
-
}
|
|
47
|
-
)
|
|
45
|
+
headers: { "Content-Type": "application/json" },
|
|
46
|
+
},
|
|
47
|
+
);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
const sessionOptions =
|
|
51
|
-
typeof options ===
|
|
51
|
+
typeof options === "function" ? await options(request) : options;
|
|
52
52
|
|
|
53
53
|
const result = await createChatSession({
|
|
54
54
|
projectSlug,
|
|
55
55
|
options: sessionOptions,
|
|
56
|
-
})
|
|
56
|
+
});
|
|
57
57
|
|
|
58
58
|
return new Response(result.body, {
|
|
59
59
|
status: result.status,
|
|
60
60
|
headers: result.headers,
|
|
61
|
-
})
|
|
62
|
-
}
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
63
|
}
|
package/src/server/core.ts
CHANGED
|
@@ -7,34 +7,34 @@ export interface SessionHandlerOptions {
|
|
|
7
7
|
/**
|
|
8
8
|
* The origin from which the token will be used
|
|
9
9
|
*/
|
|
10
|
-
embedOrigin: string
|
|
10
|
+
embedOrigin: string;
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* Free-form user identifier
|
|
14
14
|
*/
|
|
15
|
-
userIdentifier: string
|
|
15
|
+
userIdentifier: string;
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* Token expiration in seconds (max / default 3600)
|
|
19
19
|
* @default 3600
|
|
20
20
|
*/
|
|
21
|
-
expiresAfter?: number
|
|
21
|
+
expiresAfter?: number;
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
24
|
* Gram API key. If not provided, falls back to the `GRAM_API_KEY` environment variable.
|
|
25
25
|
*/
|
|
26
|
-
apiKey?: string
|
|
26
|
+
apiKey?: string;
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
export interface CreateSessionRequest {
|
|
30
|
-
projectSlug: string
|
|
31
|
-
options: SessionHandlerOptions
|
|
30
|
+
projectSlug: string;
|
|
31
|
+
options: SessionHandlerOptions;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
export interface CreateSessionResponse {
|
|
35
|
-
status: number
|
|
36
|
-
body: string
|
|
37
|
-
headers: Record<string, string
|
|
35
|
+
status: number;
|
|
36
|
+
body: string;
|
|
37
|
+
headers: Record<string, string>;
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
@@ -42,43 +42,43 @@ export interface CreateSessionResponse {
|
|
|
42
42
|
* This is framework-agnostic and can be used by any adapter.
|
|
43
43
|
*/
|
|
44
44
|
export async function createChatSession(
|
|
45
|
-
request: CreateSessionRequest
|
|
45
|
+
request: CreateSessionRequest,
|
|
46
46
|
): Promise<CreateSessionResponse> {
|
|
47
|
-
const base = process.env.GRAM_API_URL ??
|
|
47
|
+
const base = process.env.GRAM_API_URL ?? "https://app.getgram.ai";
|
|
48
48
|
|
|
49
49
|
try {
|
|
50
|
-
const response = await fetch(base +
|
|
51
|
-
method:
|
|
50
|
+
const response = await fetch(base + "/rpc/chatSessions.create", {
|
|
51
|
+
method: "POST",
|
|
52
52
|
body: JSON.stringify({
|
|
53
53
|
embed_origin: request.options.embedOrigin,
|
|
54
54
|
user_identifier: request.options.userIdentifier,
|
|
55
55
|
expires_after: request.options.expiresAfter,
|
|
56
56
|
}),
|
|
57
57
|
headers: {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
"Content-Type": "application/json",
|
|
59
|
+
"Gram-Project": request.projectSlug,
|
|
60
|
+
"Gram-Key": request.options.apiKey ?? process.env.GRAM_API_KEY ?? "",
|
|
61
61
|
},
|
|
62
|
-
})
|
|
62
|
+
});
|
|
63
63
|
|
|
64
|
-
const body = await response.text()
|
|
64
|
+
const body = await response.text();
|
|
65
65
|
|
|
66
66
|
return {
|
|
67
67
|
status: response.status,
|
|
68
68
|
body,
|
|
69
|
-
headers: {
|
|
70
|
-
}
|
|
69
|
+
headers: { "Content-Type": "application/json" },
|
|
70
|
+
};
|
|
71
71
|
} catch (error) {
|
|
72
72
|
const errorMessage =
|
|
73
|
-
error instanceof Error ? error.message :
|
|
74
|
-
console.error(
|
|
73
|
+
error instanceof Error ? error.message : "Unknown error";
|
|
74
|
+
console.error("Failed to create chat session:", error);
|
|
75
75
|
|
|
76
76
|
return {
|
|
77
77
|
status: 500,
|
|
78
78
|
body: JSON.stringify({
|
|
79
|
-
error:
|
|
79
|
+
error: "Failed to create chat session: " + errorMessage,
|
|
80
80
|
}),
|
|
81
|
-
headers: {
|
|
82
|
-
}
|
|
81
|
+
headers: { "Content-Type": "application/json" },
|
|
82
|
+
};
|
|
83
83
|
}
|
|
84
84
|
}
|
package/src/server/express.ts
CHANGED
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
* ```
|
|
20
20
|
*/
|
|
21
21
|
|
|
22
|
-
import type { Request, Response } from
|
|
23
|
-
import { createChatSession, type SessionHandlerOptions } from
|
|
22
|
+
import type { Request, Response } from "express";
|
|
23
|
+
import { createChatSession, type SessionHandlerOptions } from "./core";
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
26
|
* Create an Express request handler for the chat session endpoint.
|
|
@@ -31,30 +31,32 @@ import { createChatSession, type SessionHandlerOptions } from './core'
|
|
|
31
31
|
export function createExpressHandler(
|
|
32
32
|
options:
|
|
33
33
|
| SessionHandlerOptions
|
|
34
|
-
| ((
|
|
34
|
+
| ((
|
|
35
|
+
req: Request,
|
|
36
|
+
) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
|
|
35
37
|
) {
|
|
36
38
|
return async (req: Request, res: Response) => {
|
|
37
|
-
const projectSlug = Array.isArray(req.headers[
|
|
38
|
-
? req.headers[
|
|
39
|
-
: req.headers[
|
|
39
|
+
const projectSlug = Array.isArray(req.headers["gram-project"])
|
|
40
|
+
? req.headers["gram-project"][0]
|
|
41
|
+
: req.headers["gram-project"];
|
|
40
42
|
|
|
41
43
|
if (!projectSlug) {
|
|
42
|
-
res.status(400).json({ error:
|
|
43
|
-
return
|
|
44
|
+
res.status(400).json({ error: "Missing Gram-Project header" });
|
|
45
|
+
return;
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
const sessionOptions =
|
|
47
|
-
typeof options ===
|
|
49
|
+
typeof options === "function" ? await options(req) : options;
|
|
48
50
|
|
|
49
51
|
const result = await createChatSession({
|
|
50
52
|
projectSlug,
|
|
51
53
|
options: sessionOptions,
|
|
52
|
-
})
|
|
54
|
+
});
|
|
53
55
|
|
|
54
|
-
res.status(result.status)
|
|
56
|
+
res.status(result.status);
|
|
55
57
|
Object.entries(result.headers).forEach(([key, value]) => {
|
|
56
|
-
res.setHeader(key, value)
|
|
57
|
-
})
|
|
58
|
-
res.send(result.body)
|
|
59
|
-
}
|
|
58
|
+
res.setHeader(key, value);
|
|
59
|
+
});
|
|
60
|
+
res.send(result.body);
|
|
61
|
+
};
|
|
60
62
|
}
|
package/src/server/fastify.ts
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import type { FastifyRequest, FastifyReply } from
|
|
22
|
-
import { createChatSession, type SessionHandlerOptions } from
|
|
21
|
+
import type { FastifyRequest, FastifyReply } from "fastify";
|
|
22
|
+
import { createChatSession, type SessionHandlerOptions } from "./core";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Create a Fastify route handler for the chat session endpoint.
|
|
@@ -31,31 +31,31 @@ export function createFastifyHandler(
|
|
|
31
31
|
options:
|
|
32
32
|
| SessionHandlerOptions
|
|
33
33
|
| ((
|
|
34
|
-
request: FastifyRequest
|
|
35
|
-
) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
|
|
34
|
+
request: FastifyRequest,
|
|
35
|
+
) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
|
|
36
36
|
) {
|
|
37
37
|
return async (request: FastifyRequest, reply: FastifyReply) => {
|
|
38
|
-
const projectSlug = Array.isArray(request.headers[
|
|
39
|
-
? request.headers[
|
|
40
|
-
: request.headers[
|
|
38
|
+
const projectSlug = Array.isArray(request.headers["gram-project"])
|
|
39
|
+
? request.headers["gram-project"][0]
|
|
40
|
+
: request.headers["gram-project"];
|
|
41
41
|
|
|
42
42
|
if (!projectSlug) {
|
|
43
|
-
reply.code(400).send({ error:
|
|
44
|
-
return
|
|
43
|
+
reply.code(400).send({ error: "Missing Gram-Project header" });
|
|
44
|
+
return;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
const sessionOptions =
|
|
48
|
-
typeof options ===
|
|
48
|
+
typeof options === "function" ? await options(request) : options;
|
|
49
49
|
|
|
50
50
|
const result = await createChatSession({
|
|
51
51
|
projectSlug,
|
|
52
52
|
options: sessionOptions,
|
|
53
|
-
})
|
|
53
|
+
});
|
|
54
54
|
|
|
55
55
|
reply
|
|
56
56
|
.code(result.status)
|
|
57
57
|
.headers(result.headers)
|
|
58
|
-
.type(
|
|
59
|
-
.send(result.body)
|
|
60
|
-
}
|
|
58
|
+
.type("application/json")
|
|
59
|
+
.send(result.body);
|
|
60
|
+
};
|
|
61
61
|
}
|
package/src/server/hono.ts
CHANGED
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
* ```
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import type { Context } from
|
|
22
|
-
import { createChatSession, type SessionHandlerOptions } from
|
|
21
|
+
import type { Context } from "hono";
|
|
22
|
+
import { createChatSession, type SessionHandlerOptions } from "./core";
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
25
|
* Create a Hono route handler for the chat session endpoint.
|
|
@@ -30,26 +30,26 @@ import { createChatSession, type SessionHandlerOptions } from './core'
|
|
|
30
30
|
export function createHonoHandler(
|
|
31
31
|
options:
|
|
32
32
|
| SessionHandlerOptions
|
|
33
|
-
| ((c: Context) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
|
|
33
|
+
| ((c: Context) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
|
|
34
34
|
) {
|
|
35
35
|
return async (c: Context) => {
|
|
36
|
-
const projectSlug = c.req.header(
|
|
36
|
+
const projectSlug = c.req.header("gram-project");
|
|
37
37
|
|
|
38
38
|
if (!projectSlug) {
|
|
39
|
-
return c.json({ error:
|
|
39
|
+
return c.json({ error: "Missing Gram-Project header" }, 400);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
const sessionOptions =
|
|
43
|
-
typeof options ===
|
|
43
|
+
typeof options === "function" ? await options(c) : options;
|
|
44
44
|
|
|
45
45
|
const result = await createChatSession({
|
|
46
46
|
projectSlug,
|
|
47
47
|
options: sessionOptions,
|
|
48
|
-
})
|
|
48
|
+
});
|
|
49
49
|
|
|
50
50
|
return new Response(result.body, {
|
|
51
51
|
status: result.status,
|
|
52
52
|
headers: result.headers,
|
|
53
|
-
})
|
|
54
|
-
}
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
55
|
}
|
package/src/server/nextjs.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
|
-
import { createChatSession, type SessionHandlerOptions } from
|
|
17
|
+
import { createChatSession, type SessionHandlerOptions } from "./core";
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
20
|
* Create a Next.js App Router route handler for the chat session endpoint.
|
|
@@ -26,33 +26,33 @@ export function createNextHandler(
|
|
|
26
26
|
options:
|
|
27
27
|
| SessionHandlerOptions
|
|
28
28
|
| ((
|
|
29
|
-
request: Request
|
|
30
|
-
) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
|
|
29
|
+
request: Request,
|
|
30
|
+
) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
|
|
31
31
|
) {
|
|
32
32
|
return async (request: Request) => {
|
|
33
|
-
const projectSlug = request.headers.get(
|
|
33
|
+
const projectSlug = request.headers.get("gram-project");
|
|
34
34
|
|
|
35
35
|
if (!projectSlug) {
|
|
36
36
|
return new Response(
|
|
37
|
-
JSON.stringify({ error:
|
|
37
|
+
JSON.stringify({ error: "Missing Gram-Project header" }),
|
|
38
38
|
{
|
|
39
39
|
status: 400,
|
|
40
|
-
headers: {
|
|
41
|
-
}
|
|
42
|
-
)
|
|
40
|
+
headers: { "Content-Type": "application/json" },
|
|
41
|
+
},
|
|
42
|
+
);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
const sessionOptions =
|
|
46
|
-
typeof options ===
|
|
46
|
+
typeof options === "function" ? await options(request) : options;
|
|
47
47
|
|
|
48
48
|
const result = await createChatSession({
|
|
49
49
|
projectSlug,
|
|
50
50
|
options: sessionOptions,
|
|
51
|
-
})
|
|
51
|
+
});
|
|
52
52
|
|
|
53
53
|
return new Response(result.body, {
|
|
54
54
|
status: result.status,
|
|
55
55
|
headers: result.headers,
|
|
56
|
-
})
|
|
57
|
-
}
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
58
|
}
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
32
|
|
|
33
|
-
import { createChatSession, type SessionHandlerOptions } from
|
|
33
|
+
import { createChatSession, type SessionHandlerOptions } from "./core";
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
36
|
* Create a TanStack Start server route handler for the chat session endpoint.
|
|
@@ -45,33 +45,33 @@ export function createTanStackStartHandler(
|
|
|
45
45
|
options:
|
|
46
46
|
| SessionHandlerOptions
|
|
47
47
|
| ((
|
|
48
|
-
request: Request
|
|
49
|
-
) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
|
|
48
|
+
request: Request,
|
|
49
|
+
) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
|
|
50
50
|
) {
|
|
51
51
|
return async (request: Request) => {
|
|
52
|
-
const projectSlug = request.headers.get(
|
|
52
|
+
const projectSlug = request.headers.get("gram-project");
|
|
53
53
|
|
|
54
54
|
if (!projectSlug) {
|
|
55
55
|
return new Response(
|
|
56
|
-
JSON.stringify({ error:
|
|
56
|
+
JSON.stringify({ error: "Missing Gram-Project header" }),
|
|
57
57
|
{
|
|
58
58
|
status: 400,
|
|
59
|
-
headers: {
|
|
60
|
-
}
|
|
61
|
-
)
|
|
59
|
+
headers: { "Content-Type": "application/json" },
|
|
60
|
+
},
|
|
61
|
+
);
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
const sessionOptions =
|
|
65
|
-
typeof options ===
|
|
65
|
+
typeof options === "function" ? await options(request) : options;
|
|
66
66
|
|
|
67
67
|
const result = await createChatSession({
|
|
68
68
|
projectSlug,
|
|
69
69
|
options: sessionOptions,
|
|
70
|
-
})
|
|
70
|
+
});
|
|
71
71
|
|
|
72
72
|
return new Response(result.body, {
|
|
73
73
|
status: result.status,
|
|
74
74
|
headers: result.headers,
|
|
75
|
-
})
|
|
76
|
-
}
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
77
|
}
|
package/src/server.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { IncomingMessage, ServerResponse } from
|
|
2
|
-
import { createChatSession, type SessionHandlerOptions } from
|
|
1
|
+
import { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import { createChatSession, type SessionHandlerOptions } from "./server/core";
|
|
3
3
|
|
|
4
4
|
type ServerHandler<T> = (
|
|
5
5
|
req: IncomingMessage,
|
|
6
6
|
res: ServerResponse,
|
|
7
|
-
options?: T
|
|
8
|
-
) => Promise<void
|
|
7
|
+
options?: T,
|
|
8
|
+
) => Promise<void>;
|
|
9
9
|
|
|
10
10
|
interface ServerHandlers {
|
|
11
11
|
/**
|
|
@@ -21,7 +21,7 @@ interface ServerHandlers {
|
|
|
21
21
|
* app.listen(3000)
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
|
-
session: ServerHandler<SessionHandlerOptions
|
|
24
|
+
session: ServerHandler<SessionHandlerOptions>;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/**
|
|
@@ -35,43 +35,43 @@ interface ServerHandlers {
|
|
|
35
35
|
export const createElementsServerHandlers = (): ServerHandlers => {
|
|
36
36
|
return {
|
|
37
37
|
session: sessionHandler,
|
|
38
|
-
}
|
|
39
|
-
}
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
40
|
|
|
41
|
-
export type { SessionHandlerOptions }
|
|
41
|
+
export type { SessionHandlerOptions };
|
|
42
42
|
|
|
43
43
|
const sessionHandler: ServerHandler<SessionHandlerOptions> = async (
|
|
44
44
|
req,
|
|
45
45
|
res,
|
|
46
|
-
options
|
|
46
|
+
options,
|
|
47
47
|
) => {
|
|
48
|
-
if (req.method !==
|
|
49
|
-
res.writeHead(405, {
|
|
50
|
-
res.end(JSON.stringify({ error:
|
|
51
|
-
return
|
|
48
|
+
if (req.method !== "POST") {
|
|
49
|
+
res.writeHead(405, { "Content-Type": "application/json" });
|
|
50
|
+
res.end(JSON.stringify({ error: "Method not allowed" }));
|
|
51
|
+
return;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
const projectSlug = Array.isArray(req.headers[
|
|
55
|
-
? req.headers[
|
|
56
|
-
: req.headers[
|
|
54
|
+
const projectSlug = Array.isArray(req.headers["gram-project"])
|
|
55
|
+
? req.headers["gram-project"][0]
|
|
56
|
+
: req.headers["gram-project"];
|
|
57
57
|
|
|
58
|
-
if (!projectSlug || typeof projectSlug !==
|
|
59
|
-
res.writeHead(400, {
|
|
60
|
-
res.end(JSON.stringify({ error:
|
|
61
|
-
return
|
|
58
|
+
if (!projectSlug || typeof projectSlug !== "string") {
|
|
59
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
60
|
+
res.end(JSON.stringify({ error: "Missing Gram-Project header" }));
|
|
61
|
+
return;
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
if (!options) {
|
|
65
|
-
res.writeHead(400, {
|
|
66
|
-
res.end(JSON.stringify({ error:
|
|
67
|
-
return
|
|
65
|
+
res.writeHead(400, { "Content-Type": "application/json" });
|
|
66
|
+
res.end(JSON.stringify({ error: "Missing session options" }));
|
|
67
|
+
return;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
const result = await createChatSession({
|
|
71
71
|
projectSlug,
|
|
72
72
|
options,
|
|
73
|
-
})
|
|
73
|
+
});
|
|
74
74
|
|
|
75
|
-
res.writeHead(result.status, result.headers)
|
|
76
|
-
res.end(result.body)
|
|
77
|
-
}
|
|
75
|
+
res.writeHead(result.status, result.headers);
|
|
76
|
+
res.end(result.body);
|
|
77
|
+
};
|
package/src/storybook.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* This file extends Storybook's Parameters interface to provide
|
|
5
5
|
* type safety for the `elements` parameter used in stories.
|
|
6
6
|
*/
|
|
7
|
-
import type { ElementsConfig } from
|
|
7
|
+
import type { ElementsConfig } from "./types";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Configuration for the elements decorator in Storybook stories.
|
|
@@ -14,15 +14,15 @@ export interface ElementsParameters {
|
|
|
14
14
|
* Partial configuration that will be merged with the default Elements config.
|
|
15
15
|
* Use this to override specific config values per-story.
|
|
16
16
|
*/
|
|
17
|
-
config?: Partial<ElementsConfig
|
|
17
|
+
config?: Partial<ElementsConfig>;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
declare module
|
|
20
|
+
declare module "storybook/internal/csf" {
|
|
21
21
|
interface Parameters {
|
|
22
22
|
/**
|
|
23
23
|
* Custom parameters for the Gram Elements decorator.
|
|
24
24
|
* The config is passed to ElementsProvider and merged with defaults.
|
|
25
25
|
*/
|
|
26
|
-
elements?: ElementsParameters
|
|
26
|
+
elements?: ElementsParameters;
|
|
27
27
|
}
|
|
28
28
|
}
|