@super_studio/ecforce-ai-agent-react 0.5.0 → 0.5.2

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.
@@ -2,10 +2,18 @@ import type { MCP } from "./provider/use-chatbot-frame-handler";
2
2
  export type ChatbotFrameProps = {
3
3
  /** 管理画面上のエージェントID */
4
4
  agentId: string;
5
+ /** 初期化時のチャットID */
6
+ initialChatId?: string;
5
7
  /** エージェントにつなげるMCPの情報 */
6
8
  mcps?: MCP[];
7
9
  /** アプリ名のメタデータ */
8
10
  appName?: string;
11
+ /** セッションを取得するための関数 */
12
+ getSession?: () => Promise<{
13
+ sessionId: string;
14
+ token: string;
15
+ expiresAt: string;
16
+ }>;
9
17
  /**
10
18
  * trueになるまで、初期化されません。
11
19
  * 初期化せれたあとはもう使われません。
@@ -21,5 +29,14 @@ export type ChatbotFrameProps = {
21
29
  url?: string;
22
30
  className?: string;
23
31
  };
24
- export declare function ChatbotFrame({ agentId, appName, mcps, enabled, url, className, }: ChatbotFrameProps): import("react/jsx-runtime").JSX.Element;
32
+ export declare function ChatbotFrame({ agentId, appName, initialChatId, mcps, getSession, enabled, url, className, }: ChatbotFrameProps): import("react/jsx-runtime").JSX.Element;
33
+ export type SessionData = {
34
+ sessionId: string;
35
+ token: string;
36
+ expiresAt: string;
37
+ };
38
+ export type UseSessionProps = {
39
+ getSession?: () => Promise<SessionData>;
40
+ };
41
+ export declare function useSession({ getSession }: UseSessionProps): string | undefined;
25
42
  //# sourceMappingURL=chatbot-frame.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatbot-frame.d.ts","sourceRoot":"","sources":["../../src/components/chatbot-frame.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sCAAsC,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,wBAAwB;IACxB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,IAAI,EACJ,OAAc,EACd,GAAG,EACH,SAAS,GACV,EAAE,iBAAiB,2CAkDnB"}
1
+ {"version":3,"file":"chatbot-frame.d.ts","sourceRoot":"","sources":["../../src/components/chatbot-frame.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sCAAsC,CAAC;AAEhE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,qBAAqB;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wBAAwB;IACxB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,iBAAiB;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;OAKG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,OAAO,EACP,aAAa,EACb,IAAI,EACJ,UAAU,EACV,OAAc,EACd,GAAG,EACH,SAAS,GACV,EAAE,iBAAiB,2CAgFnB;AAoBD,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;CACzC,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,UAAU,EAAE,EAAE,eAAe,sBAuCzD"}
@@ -17,6 +17,8 @@ type ChatbotContextType = {
17
17
  setMcps: (mcps: MCP[]) => void;
18
18
  /** アプリ名を設定 */
19
19
  setAppName: (appName: string) => void;
20
+ /** セッショントークンを設定 */
21
+ setSessionToken: (sessionToken: string) => void;
20
22
  /** チャットボットが準備できたか */
21
23
  isReady: boolean;
22
24
  /** チャットボットが初期化されたか */
@@ -33,4 +35,4 @@ type ChatbotProviderProps = {
33
35
  };
34
36
  export declare function ChatbotProvider({ children }: ChatbotProviderProps): import("react/jsx-runtime").JSX.Element;
35
37
  export {};
36
- //# sourceMappingURL=chatbot-proivder.d.ts.map
38
+ //# sourceMappingURL=chatbot-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chatbot-proivder.d.ts","sourceRoot":"","sources":["../../../src/components/provider/chatbot-proivder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,GAAG,EACT,MAAM,6BAA6B,CAAC;AAGrC,KAAK,kBAAkB,GAAG;IACxB,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,iBAAiB;IACjB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,sBAAsB;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB;IACnB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,kBAAkB;IAClB,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACjC,aAAa;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC/B,cAAc;IACd,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3D,CAAC;AAMF,wBAAgB,UAAU,uBAMzB;AAED,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CA0BjE"}
1
+ {"version":3,"file":"chatbot-provider.d.ts","sourceRoot":"","sources":["../../../src/components/provider/chatbot-provider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,GAAG,EACT,MAAM,6BAA6B,CAAC;AAGrC,KAAK,kBAAkB,GAAG;IACxB,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,qBAAqB;IACrB,IAAI,EAAE,OAAO,CAAC;IACd,iBAAiB;IACjB,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,sBAAsB;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB;IACnB,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,kBAAkB;IAClB,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACjC,aAAa;IACb,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAC/B,cAAc;IACd,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,mBAAmB;IACnB,eAAe,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,qBAAqB;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,sBAAsB;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,KAAK,IAAI,CAAC;CAC3D,CAAC;AAMF,wBAAgB,UAAU,uBAMzB;AAED,KAAK,oBAAoB,GAAG;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,QAAQ,EAAE,EAAE,oBAAoB,2CAkCjE"}
@@ -18,6 +18,7 @@ export type MCP = {
18
18
  export type InitProps = {
19
19
  mcps?: MCP[];
20
20
  appName?: string;
21
+ sessionToken?: string;
21
22
  };
22
23
  export type ParentMessage = {
23
24
  type: "mcps";
@@ -25,10 +26,14 @@ export type ParentMessage = {
25
26
  } | {
26
27
  type: "appName";
27
28
  appName: string;
29
+ } | {
30
+ type: "sessionToken";
31
+ sessionToken: string;
28
32
  } | {
29
33
  type: "init";
30
34
  mcps?: MCP[];
31
35
  appName?: string;
36
+ sessionToken?: string;
32
37
  };
33
38
  export declare function useChatbotFrameHandler({ setOpen, setIsExpanded, }: {
34
39
  setOpen: (open: boolean) => void;
@@ -37,6 +42,7 @@ export declare function useChatbotFrameHandler({ setOpen, setIsExpanded, }: {
37
42
  init: (props: InitProps) => void;
38
43
  setMcps: (mcps: MCP[]) => void;
39
44
  setAppName: (appName: string) => void;
45
+ setSessionToken: (sessionToken: string) => void;
40
46
  setIframeEl: React.Dispatch<React.SetStateAction<HTMLIFrameElement | null>>;
41
47
  isReady: boolean;
42
48
  isInitialized: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"use-chatbot-frame-handler.d.ts","sourceRoot":"","sources":["../../../src/components/provider/use-chatbot-frame-handler.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B,MAAM,MAAM,GAAG,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;CACb,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEN,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,aAAa,GACd,EAAE;IACD,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;kBAqBW,SAAS;oBAUV,GAAG,EAAE;0BAOF,MAAM;;;;EAkDnB"}
1
+ {"version":3,"file":"use-chatbot-frame-handler.d.ts","sourceRoot":"","sources":["../../../src/components/provider/use-chatbot-frame-handler.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,qBAAqB,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,eAAe,CAAA;CAAE,GACzB;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAE/B,MAAM,MAAM,GAAG,GAAG;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,aAAa,GACrB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,EAAE,CAAC;CACb,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB,GACD;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEN,wBAAgB,sBAAsB,CAAC,EACrC,OAAO,EACP,aAAa,GACd,EAAE;IACD,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACjC,aAAa,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5C;kBAqBW,SAAS;oBAUV,GAAG,EAAE;0BAOF,MAAM;oCAOD,MAAM;;;;EA0DxB"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from "./components/provider/chatbot-proivder";
1
+ export * from "./components/provider/chatbot-provider";
2
2
  export * from "./components/chatbot-frame";
3
3
  export * from "./components/chatbot-sheet";
4
4
  export * from "./components/sheet";
package/dist/index.js CHANGED
@@ -31,7 +31,7 @@ var __objRest = (source, exclude) => {
31
31
  return target;
32
32
  };
33
33
 
34
- // src/components/provider/chatbot-proivder.tsx
34
+ // src/components/provider/chatbot-provider.tsx
35
35
  var _react = require('react'); var React5 = _interopRequireWildcard(_react);
36
36
 
37
37
  // src/components/provider/use-chatbot-frame-handler.tsx
@@ -76,6 +76,12 @@ function useChatbotFrameHandler({
76
76
  },
77
77
  [postMessage]
78
78
  );
79
+ const setSessionToken = React5.default.useCallback(
80
+ (sessionToken) => {
81
+ postMessage({ type: "sessionToken", sessionToken });
82
+ },
83
+ [postMessage]
84
+ );
79
85
  React5.default.useEffect(() => {
80
86
  const iframe = iframeEl;
81
87
  if (!iframe) {
@@ -113,7 +119,15 @@ function useChatbotFrameHandler({
113
119
  iframe.removeEventListener("load", handleIframeLoad);
114
120
  };
115
121
  }, [iframeEl]);
116
- return { init, setMcps, setAppName, setIframeEl, isReady, isInitialized };
122
+ return {
123
+ init,
124
+ setMcps,
125
+ setAppName,
126
+ setSessionToken,
127
+ setIframeEl,
128
+ isReady,
129
+ isInitialized
130
+ };
117
131
  }
118
132
 
119
133
  // src/components/provider/use-chatbot-window-states.tsx
@@ -130,7 +144,7 @@ function useChatbotWindowStates() {
130
144
  return { hasOpened, open, isExpanded, setOpen, setIsExpanded };
131
145
  }
132
146
 
133
- // src/components/provider/chatbot-proivder.tsx
147
+ // src/components/provider/chatbot-provider.tsx
134
148
  var _jsxruntime = require('react/jsx-runtime');
135
149
  var ChatbotContext = React5.default.createContext(
136
150
  void 0
@@ -144,7 +158,15 @@ function useChatbot() {
144
158
  }
145
159
  function ChatbotProvider({ children }) {
146
160
  const { hasOpened, open, isExpanded, setOpen, setIsExpanded } = useChatbotWindowStates();
147
- const { setMcps, setAppName, init, isReady, isInitialized, setIframeEl } = useChatbotFrameHandler({
161
+ const {
162
+ setMcps,
163
+ setAppName,
164
+ setSessionToken,
165
+ init,
166
+ isReady,
167
+ isInitialized,
168
+ setIframeEl
169
+ } = useChatbotFrameHandler({
148
170
  setOpen,
149
171
  setIsExpanded
150
172
  });
@@ -154,6 +176,7 @@ function ChatbotProvider({ children }) {
154
176
  setOpen,
155
177
  isExpanded,
156
178
  setIsExpanded,
179
+ setSessionToken,
157
180
  init,
158
181
  setMcps,
159
182
  setAppName,
@@ -168,33 +191,44 @@ function ChatbotProvider({ children }) {
168
191
 
169
192
 
170
193
  // src/lib/constants.ts
171
- var PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
194
+ var PROD_CHATBOT_URL = "https://agent.ec-force.com";
172
195
 
173
196
  // src/components/chatbot-frame.tsx
174
197
 
175
198
  function ChatbotFrame({
176
199
  agentId,
177
200
  appName,
201
+ initialChatId,
178
202
  mcps,
203
+ getSession,
179
204
  enabled = true,
180
205
  url,
181
206
  className
182
207
  }) {
183
208
  var _a;
184
- const chatbotUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
209
+ const baseUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
185
210
  const { setIframeEl } = useChatbot();
186
- const { init, setMcps, setAppName, isReady } = useChatbot();
211
+ const { init, setMcps, setAppName, setSessionToken, isReady } = useChatbot();
187
212
  const sentInitRef = React5.default.useRef(false);
188
213
  const [currentMcps, setCurrentMcps] = React5.default.useState();
189
214
  const [currentAppName, setCurrentAppName] = React5.default.useState();
215
+ const [currentSessionToken, setCurrentSessionToken] = React5.default.useState();
216
+ const sessionToken = useSession({ getSession });
217
+ const shouldInit = enabled && isReady && // getSessionが定義されていれば、currentSessionが設定されるまで待つ
218
+ !!(sessionToken || getSession === void 0);
190
219
  React5.default.useEffect(() => {
191
- if (enabled && isReady && !sentInitRef.current) {
192
- init({ mcps, appName });
220
+ if (shouldInit && !sentInitRef.current) {
221
+ init({
222
+ mcps,
223
+ appName,
224
+ sessionToken
225
+ });
193
226
  sentInitRef.current = true;
194
227
  setCurrentMcps(mcps);
195
228
  setCurrentAppName(appName);
229
+ setCurrentSessionToken(sessionToken);
196
230
  }
197
- }, [enabled, init, mcps, appName, isReady]);
231
+ }, [enabled, init, mcps, appName, isReady, sessionToken]);
198
232
  React5.default.useEffect(() => {
199
233
  if (sentInitRef.current && mcps && JSON.stringify(currentMcps) !== JSON.stringify(mcps)) {
200
234
  setMcps(mcps);
@@ -207,11 +241,21 @@ function ChatbotFrame({
207
241
  setAppName(appName);
208
242
  }
209
243
  }, [appName]);
244
+ React5.default.useEffect(() => {
245
+ if (sentInitRef.current && sessionToken && currentSessionToken !== sessionToken) {
246
+ setCurrentSessionToken(sessionToken);
247
+ setSessionToken(sessionToken);
248
+ }
249
+ }, [sessionToken]);
210
250
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
211
251
  "iframe",
212
252
  {
213
253
  ref: setIframeEl,
214
- src: `${chatbotUrl}/embed/${agentId}`,
254
+ src: buildIframeUrl({
255
+ baseUrl,
256
+ agentId,
257
+ initialChatId
258
+ }),
215
259
  className,
216
260
  allow: "clipboard-write",
217
261
  style: {
@@ -221,6 +265,47 @@ function ChatbotFrame({
221
265
  }
222
266
  );
223
267
  }
268
+ function buildIframeUrl({
269
+ baseUrl,
270
+ agentId,
271
+ initialChatId
272
+ }) {
273
+ const url = new URL(`/embed/${agentId}`, baseUrl);
274
+ if (initialChatId) {
275
+ url.searchParams.set("initialChatId", initialChatId);
276
+ }
277
+ return url.toString();
278
+ }
279
+ function useSession({ getSession }) {
280
+ const { setSessionToken } = useChatbot();
281
+ const [session, setSession] = React5.default.useState();
282
+ const isFetchingSessionRef = React5.default.useRef(false);
283
+ React5.default.useEffect(() => {
284
+ if (!getSession) return;
285
+ let intervalId;
286
+ const fetchSession = async () => {
287
+ if (isFetchingSessionRef.current) return;
288
+ try {
289
+ isFetchingSessionRef.current = true;
290
+ const session2 = await getSession();
291
+ setSession(session2);
292
+ setSessionToken(session2.token);
293
+ } catch (error) {
294
+ console.error("Failed to get session:", error);
295
+ } finally {
296
+ isFetchingSessionRef.current = false;
297
+ }
298
+ };
299
+ fetchSession();
300
+ intervalId = setInterval(fetchSession, 15 * 60 * 1e3);
301
+ return () => {
302
+ if (intervalId) {
303
+ clearInterval(intervalId);
304
+ }
305
+ };
306
+ }, [getSession, setSessionToken]);
307
+ return session == null ? void 0 : session.token;
308
+ }
224
309
 
225
310
  // src/components/chatbot-sheet.tsx
226
311
 
@@ -461,4 +546,5 @@ function EcforceAiIcon() {
461
546
 
462
547
 
463
548
 
464
- exports.ChatbotFrame = ChatbotFrame; exports.ChatbotProvider = ChatbotProvider; exports.ChatbotSheet = ChatbotSheet; exports.Sheet = Sheet; exports.SheetClose = SheetClose; exports.SheetContent = SheetContent; exports.SheetDescription = SheetDescription; exports.SheetFooter = SheetFooter; exports.SheetHeader = SheetHeader; exports.SheetTitle = SheetTitle; exports.SheetTrigger = SheetTrigger; exports.Tooltip = Tooltip; exports.useChatbot = useChatbot;
549
+
550
+ exports.ChatbotFrame = ChatbotFrame; exports.ChatbotProvider = ChatbotProvider; exports.ChatbotSheet = ChatbotSheet; exports.Sheet = Sheet; exports.SheetClose = SheetClose; exports.SheetContent = SheetContent; exports.SheetDescription = SheetDescription; exports.SheetFooter = SheetFooter; exports.SheetHeader = SheetHeader; exports.SheetTitle = SheetTitle; exports.SheetTrigger = SheetTrigger; exports.Tooltip = Tooltip; exports.useChatbot = useChatbot; exports.useSession = useSession;
package/dist/index.mjs CHANGED
@@ -31,7 +31,7 @@ var __objRest = (source, exclude) => {
31
31
  return target;
32
32
  };
33
33
 
34
- // src/components/provider/chatbot-proivder.tsx
34
+ // src/components/provider/chatbot-provider.tsx
35
35
  import React3 from "react";
36
36
 
37
37
  // src/components/provider/use-chatbot-frame-handler.tsx
@@ -76,6 +76,12 @@ function useChatbotFrameHandler({
76
76
  },
77
77
  [postMessage]
78
78
  );
79
+ const setSessionToken = React.useCallback(
80
+ (sessionToken) => {
81
+ postMessage({ type: "sessionToken", sessionToken });
82
+ },
83
+ [postMessage]
84
+ );
79
85
  React.useEffect(() => {
80
86
  const iframe = iframeEl;
81
87
  if (!iframe) {
@@ -113,7 +119,15 @@ function useChatbotFrameHandler({
113
119
  iframe.removeEventListener("load", handleIframeLoad);
114
120
  };
115
121
  }, [iframeEl]);
116
- return { init, setMcps, setAppName, setIframeEl, isReady, isInitialized };
122
+ return {
123
+ init,
124
+ setMcps,
125
+ setAppName,
126
+ setSessionToken,
127
+ setIframeEl,
128
+ isReady,
129
+ isInitialized
130
+ };
117
131
  }
118
132
 
119
133
  // src/components/provider/use-chatbot-window-states.tsx
@@ -130,7 +144,7 @@ function useChatbotWindowStates() {
130
144
  return { hasOpened, open, isExpanded, setOpen, setIsExpanded };
131
145
  }
132
146
 
133
- // src/components/provider/chatbot-proivder.tsx
147
+ // src/components/provider/chatbot-provider.tsx
134
148
  import { jsx } from "react/jsx-runtime";
135
149
  var ChatbotContext = React3.createContext(
136
150
  void 0
@@ -144,7 +158,15 @@ function useChatbot() {
144
158
  }
145
159
  function ChatbotProvider({ children }) {
146
160
  const { hasOpened, open, isExpanded, setOpen, setIsExpanded } = useChatbotWindowStates();
147
- const { setMcps, setAppName, init, isReady, isInitialized, setIframeEl } = useChatbotFrameHandler({
161
+ const {
162
+ setMcps,
163
+ setAppName,
164
+ setSessionToken,
165
+ init,
166
+ isReady,
167
+ isInitialized,
168
+ setIframeEl
169
+ } = useChatbotFrameHandler({
148
170
  setOpen,
149
171
  setIsExpanded
150
172
  });
@@ -154,6 +176,7 @@ function ChatbotProvider({ children }) {
154
176
  setOpen,
155
177
  isExpanded,
156
178
  setIsExpanded,
179
+ setSessionToken,
157
180
  init,
158
181
  setMcps,
159
182
  setAppName,
@@ -168,33 +191,44 @@ function ChatbotProvider({ children }) {
168
191
  import React4 from "react";
169
192
 
170
193
  // src/lib/constants.ts
171
- var PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
194
+ var PROD_CHATBOT_URL = "https://agent.ec-force.com";
172
195
 
173
196
  // src/components/chatbot-frame.tsx
174
197
  import { jsx as jsx2 } from "react/jsx-runtime";
175
198
  function ChatbotFrame({
176
199
  agentId,
177
200
  appName,
201
+ initialChatId,
178
202
  mcps,
203
+ getSession,
179
204
  enabled = true,
180
205
  url,
181
206
  className
182
207
  }) {
183
208
  var _a;
184
- const chatbotUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
209
+ const baseUrl = (_a = url != null ? url : process.env.CHATBOT_URL) != null ? _a : PROD_CHATBOT_URL;
185
210
  const { setIframeEl } = useChatbot();
186
- const { init, setMcps, setAppName, isReady } = useChatbot();
211
+ const { init, setMcps, setAppName, setSessionToken, isReady } = useChatbot();
187
212
  const sentInitRef = React4.useRef(false);
188
213
  const [currentMcps, setCurrentMcps] = React4.useState();
189
214
  const [currentAppName, setCurrentAppName] = React4.useState();
215
+ const [currentSessionToken, setCurrentSessionToken] = React4.useState();
216
+ const sessionToken = useSession({ getSession });
217
+ const shouldInit = enabled && isReady && // getSessionが定義されていれば、currentSessionが設定されるまで待つ
218
+ !!(sessionToken || getSession === void 0);
190
219
  React4.useEffect(() => {
191
- if (enabled && isReady && !sentInitRef.current) {
192
- init({ mcps, appName });
220
+ if (shouldInit && !sentInitRef.current) {
221
+ init({
222
+ mcps,
223
+ appName,
224
+ sessionToken
225
+ });
193
226
  sentInitRef.current = true;
194
227
  setCurrentMcps(mcps);
195
228
  setCurrentAppName(appName);
229
+ setCurrentSessionToken(sessionToken);
196
230
  }
197
- }, [enabled, init, mcps, appName, isReady]);
231
+ }, [enabled, init, mcps, appName, isReady, sessionToken]);
198
232
  React4.useEffect(() => {
199
233
  if (sentInitRef.current && mcps && JSON.stringify(currentMcps) !== JSON.stringify(mcps)) {
200
234
  setMcps(mcps);
@@ -207,11 +241,21 @@ function ChatbotFrame({
207
241
  setAppName(appName);
208
242
  }
209
243
  }, [appName]);
244
+ React4.useEffect(() => {
245
+ if (sentInitRef.current && sessionToken && currentSessionToken !== sessionToken) {
246
+ setCurrentSessionToken(sessionToken);
247
+ setSessionToken(sessionToken);
248
+ }
249
+ }, [sessionToken]);
210
250
  return /* @__PURE__ */ jsx2(
211
251
  "iframe",
212
252
  {
213
253
  ref: setIframeEl,
214
- src: `${chatbotUrl}/embed/${agentId}`,
254
+ src: buildIframeUrl({
255
+ baseUrl,
256
+ agentId,
257
+ initialChatId
258
+ }),
215
259
  className,
216
260
  allow: "clipboard-write",
217
261
  style: {
@@ -221,6 +265,47 @@ function ChatbotFrame({
221
265
  }
222
266
  );
223
267
  }
268
+ function buildIframeUrl({
269
+ baseUrl,
270
+ agentId,
271
+ initialChatId
272
+ }) {
273
+ const url = new URL(`/embed/${agentId}`, baseUrl);
274
+ if (initialChatId) {
275
+ url.searchParams.set("initialChatId", initialChatId);
276
+ }
277
+ return url.toString();
278
+ }
279
+ function useSession({ getSession }) {
280
+ const { setSessionToken } = useChatbot();
281
+ const [session, setSession] = React4.useState();
282
+ const isFetchingSessionRef = React4.useRef(false);
283
+ React4.useEffect(() => {
284
+ if (!getSession) return;
285
+ let intervalId;
286
+ const fetchSession = async () => {
287
+ if (isFetchingSessionRef.current) return;
288
+ try {
289
+ isFetchingSessionRef.current = true;
290
+ const session2 = await getSession();
291
+ setSession(session2);
292
+ setSessionToken(session2.token);
293
+ } catch (error) {
294
+ console.error("Failed to get session:", error);
295
+ } finally {
296
+ isFetchingSessionRef.current = false;
297
+ }
298
+ };
299
+ fetchSession();
300
+ intervalId = setInterval(fetchSession, 15 * 60 * 1e3);
301
+ return () => {
302
+ if (intervalId) {
303
+ clearInterval(intervalId);
304
+ }
305
+ };
306
+ }, [getSession, setSessionToken]);
307
+ return session == null ? void 0 : session.token;
308
+ }
224
309
 
225
310
  // src/components/chatbot-sheet.tsx
226
311
  import "react";
@@ -460,5 +545,6 @@ export {
460
545
  SheetTitle,
461
546
  SheetTrigger,
462
547
  Tooltip,
463
- useChatbot
548
+ useChatbot,
549
+ useSession
464
550
  };
@@ -1,2 +1,2 @@
1
- export declare const PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
1
+ export declare const PROD_CHATBOT_URL = "https://agent.ec-force.com";
2
2
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,wCAAwC,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB,+BAA+B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@super_studio/ecforce-ai-agent-react",
3
- "version": "0.5.0",
3
+ "version": "0.5.2",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",
@@ -1,15 +1,23 @@
1
1
  import React from "react";
2
2
  import { PROD_CHATBOT_URL } from "../lib/constants";
3
- import { useChatbot } from "./provider/chatbot-proivder";
3
+ import { useChatbot } from "./provider/chatbot-provider";
4
4
  import type { MCP } from "./provider/use-chatbot-frame-handler";
5
5
 
6
6
  export type ChatbotFrameProps = {
7
7
  /** 管理画面上のエージェントID */
8
8
  agentId: string;
9
+ /** 初期化時のチャットID */
10
+ initialChatId?: string;
9
11
  /** エージェントにつなげるMCPの情報 */
10
12
  mcps?: MCP[];
11
13
  /** アプリ名のメタデータ */
12
14
  appName?: string;
15
+ /** セッションを取得するための関数 */
16
+ getSession?: () => Promise<{
17
+ sessionId: string;
18
+ token: string;
19
+ expiresAt: string;
20
+ }>;
13
21
  /**
14
22
  * trueになるまで、初期化されません。
15
23
  * 初期化せれたあとはもう使われません。
@@ -29,27 +37,43 @@ export type ChatbotFrameProps = {
29
37
  export function ChatbotFrame({
30
38
  agentId,
31
39
  appName,
40
+ initialChatId,
32
41
  mcps,
42
+ getSession,
33
43
  enabled = true,
34
44
  url,
35
45
  className,
36
46
  }: ChatbotFrameProps) {
37
- const chatbotUrl = url ?? process.env.CHATBOT_URL ?? PROD_CHATBOT_URL;
47
+ const baseUrl = url ?? process.env.CHATBOT_URL ?? PROD_CHATBOT_URL;
38
48
  const { setIframeEl } = useChatbot();
39
- const { init, setMcps, setAppName, isReady } = useChatbot();
49
+ const { init, setMcps, setAppName, setSessionToken, isReady } = useChatbot();
40
50
  const sentInitRef = React.useRef(false);
41
51
  const [currentMcps, setCurrentMcps] = React.useState<MCP[]>();
42
52
  const [currentAppName, setCurrentAppName] = React.useState<string>();
53
+ const [currentSessionToken, setCurrentSessionToken] =
54
+ React.useState<string>();
55
+ const sessionToken = useSession({ getSession });
56
+
57
+ const shouldInit =
58
+ enabled &&
59
+ isReady &&
60
+ // getSessionが定義されていれば、currentSessionが設定されるまで待つ
61
+ !!(sessionToken || getSession === undefined);
43
62
 
44
63
  // 初期化の仕組み
45
64
  React.useEffect(() => {
46
- if (enabled && isReady && !sentInitRef.current) {
47
- init({ mcps, appName });
65
+ if (shouldInit && !sentInitRef.current) {
66
+ init({
67
+ mcps,
68
+ appName,
69
+ sessionToken,
70
+ });
48
71
  sentInitRef.current = true;
49
72
  setCurrentMcps(mcps);
50
73
  setCurrentAppName(appName);
74
+ setCurrentSessionToken(sessionToken);
51
75
  }
52
- }, [enabled, init, mcps, appName, isReady]);
76
+ }, [enabled, init, mcps, appName, isReady, sessionToken]);
53
77
 
54
78
  // mcpsの更新の仕組み
55
79
  React.useEffect(() => {
@@ -71,10 +95,26 @@ export function ChatbotFrame({
71
95
  }
72
96
  }, [appName]);
73
97
 
98
+ // sessionTokenの更新の仕組み
99
+ React.useEffect(() => {
100
+ if (
101
+ sentInitRef.current &&
102
+ sessionToken &&
103
+ currentSessionToken !== sessionToken
104
+ ) {
105
+ setCurrentSessionToken(sessionToken);
106
+ setSessionToken(sessionToken);
107
+ }
108
+ }, [sessionToken]);
109
+
74
110
  return (
75
111
  <iframe
76
112
  ref={setIframeEl}
77
- src={`${chatbotUrl}/embed/${agentId}`}
113
+ src={buildIframeUrl({
114
+ baseUrl,
115
+ agentId,
116
+ initialChatId,
117
+ })}
78
118
  className={className}
79
119
  allow="clipboard-write"
80
120
  style={{
@@ -84,3 +124,72 @@ export function ChatbotFrame({
84
124
  />
85
125
  );
86
126
  }
127
+
128
+ function buildIframeUrl({
129
+ baseUrl,
130
+ agentId,
131
+ initialChatId,
132
+ }: {
133
+ baseUrl: string;
134
+ agentId: string;
135
+ initialChatId?: string;
136
+ }) {
137
+ const url = new URL(`/embed/${agentId}`, baseUrl);
138
+
139
+ if (initialChatId) {
140
+ url.searchParams.set("initialChatId", initialChatId);
141
+ }
142
+
143
+ return url.toString();
144
+ }
145
+
146
+ export type SessionData = {
147
+ sessionId: string;
148
+ token: string;
149
+ expiresAt: string;
150
+ };
151
+
152
+ export type UseSessionProps = {
153
+ getSession?: () => Promise<SessionData>;
154
+ };
155
+
156
+ export function useSession({ getSession }: UseSessionProps) {
157
+ const { setSessionToken } = useChatbot();
158
+ const [session, setSession] = React.useState<SessionData>();
159
+ const isFetchingSessionRef = React.useRef(false);
160
+
161
+ // セッションの取得と定期更新
162
+ React.useEffect(() => {
163
+ if (!getSession) return;
164
+
165
+ let intervalId: NodeJS.Timeout;
166
+
167
+ const fetchSession = async () => {
168
+ if (isFetchingSessionRef.current) return;
169
+ try {
170
+ isFetchingSessionRef.current = true;
171
+ const session = await getSession();
172
+ setSession(session);
173
+ setSessionToken(session.token);
174
+ } catch (error) {
175
+ console.error("Failed to get session:", error);
176
+ } finally {
177
+ isFetchingSessionRef.current = false;
178
+ }
179
+ };
180
+
181
+ // 初回実行
182
+ fetchSession();
183
+
184
+ // 15分ごとに実行
185
+ intervalId = setInterval(fetchSession, 15 * 60 * 1000);
186
+
187
+ return () => {
188
+ if (intervalId) {
189
+ clearInterval(intervalId);
190
+ }
191
+ };
192
+ }, [getSession, setSessionToken]);
193
+
194
+ return session?.token;
195
+ }
@@ -23,6 +23,8 @@ type ChatbotContextType = {
23
23
  setMcps: (mcps: MCP[]) => void;
24
24
  /** アプリ名を設定 */
25
25
  setAppName: (appName: string) => void;
26
+ /** セッショントークンを設定 */
27
+ setSessionToken: (sessionToken: string) => void;
26
28
  /** チャットボットが準備できたか */
27
29
  isReady: boolean;
28
30
  /** チャットボットが初期化されたか */
@@ -53,11 +55,18 @@ type ChatbotProviderProps = {
53
55
  export function ChatbotProvider({ children }: ChatbotProviderProps) {
54
56
  const { hasOpened, open, isExpanded, setOpen, setIsExpanded } =
55
57
  useChatbotWindowStates();
56
- const { setMcps, setAppName, init, isReady, isInitialized, setIframeEl } =
57
- useChatbotFrameHandler({
58
- setOpen,
59
- setIsExpanded,
60
- });
58
+ const {
59
+ setMcps,
60
+ setAppName,
61
+ setSessionToken,
62
+ init,
63
+ isReady,
64
+ isInitialized,
65
+ setIframeEl,
66
+ } = useChatbotFrameHandler({
67
+ setOpen,
68
+ setIsExpanded,
69
+ });
61
70
 
62
71
  const value = {
63
72
  hasOpened,
@@ -65,6 +74,7 @@ export function ChatbotProvider({ children }: ChatbotProviderProps) {
65
74
  setOpen,
66
75
  isExpanded,
67
76
  setIsExpanded,
77
+ setSessionToken,
68
78
  init,
69
79
  setMcps,
70
80
  setAppName,
@@ -16,6 +16,7 @@ export type MCP = {
16
16
  export type InitProps = {
17
17
  mcps?: MCP[];
18
18
  appName?: string;
19
+ sessionToken?: string;
19
20
  };
20
21
 
21
22
  export type ParentMessage =
@@ -27,10 +28,15 @@ export type ParentMessage =
27
28
  type: "appName";
28
29
  appName: string;
29
30
  }
31
+ | {
32
+ type: "sessionToken";
33
+ sessionToken: string;
34
+ }
30
35
  | {
31
36
  type: "init";
32
37
  mcps?: MCP[];
33
38
  appName?: string;
39
+ sessionToken?: string;
34
40
  };
35
41
 
36
42
  export function useChatbotFrameHandler({
@@ -83,6 +89,13 @@ export function useChatbotFrameHandler({
83
89
  [postMessage],
84
90
  );
85
91
 
92
+ const setSessionToken = React.useCallback(
93
+ (sessionToken: string) => {
94
+ postMessage({ type: "sessionToken", sessionToken });
95
+ },
96
+ [postMessage],
97
+ );
98
+
86
99
  // Initialize and setup listeners
87
100
  React.useEffect(() => {
88
101
  const iframe = iframeEl;
@@ -126,5 +139,13 @@ export function useChatbotFrameHandler({
126
139
  };
127
140
  }, [iframeEl]); // Run when iframe gets mounted
128
141
 
129
- return { init, setMcps, setAppName, setIframeEl, isReady, isInitialized };
142
+ return {
143
+ init,
144
+ setMcps,
145
+ setAppName,
146
+ setSessionToken,
147
+ setIframeEl,
148
+ isReady,
149
+ isInitialized,
150
+ };
130
151
  }
@@ -1,6 +1,6 @@
1
1
  import * as SheetPrimitive from "@radix-ui/react-dialog";
2
2
  import * as React from "react";
3
- import { useChatbot } from "./provider/chatbot-proivder";
3
+ import { useChatbot } from "./provider/chatbot-provider";
4
4
 
5
5
  function Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {
6
6
  const { open, setOpen } = useChatbot();
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from "./components/provider/chatbot-proivder";
1
+ export * from "./components/provider/chatbot-provider";
2
2
  export * from "./components/chatbot-frame";
3
3
  export * from "./components/chatbot-sheet";
4
4
  export * from "./components/sheet";
@@ -1 +1 @@
1
- export const PROD_CHATBOT_URL = "https://ecforce-ai-agent.vercel.app";
1
+ export const PROD_CHATBOT_URL = "https://agent.ec-force.com";